2012-01-10 12 views

risposta

9

Since version 9.5, viene costruito in funzioni: array_position() e array_positions(), per la ricerca chiave dell'array (solo la prima occorrenza) oi tasti (tutte le occorrenze), per valore.

Queste funzioni supportano il tipo anyarray.

27

Il documentation recommends utilizza la funzione generate_subscripts. La funzione di sotto di emulare PHP di array_search:

CREATE FUNCTION array_search(needle ANYELEMENT, haystack ANYARRAY) 
RETURNS INT AS $$ 
    SELECT i 
     FROM generate_subscripts($2, 1) AS i 
    WHERE $2[i] = $1 
    ORDER BY i 
$$ LANGUAGE sql STABLE; 

Questo restituisce l'indice della prima partita, se presente. Se vuoi tutte le partite, cambia semplicemente RETURNS INT a RETURNS SETOF INT. Questa funzione, come è, restituisce NULL se non viene trovata alcuna corrispondenza.

Questa funzione funziona solo con matrici unidimensionali.

Inoltre, tenere presente che array_search(NULL, a) restituisce sempre NULL, anche se l'array contiene elementi null:

> SELECT array_search(null, array[1, 2, null, 4]); 
array_search 
-------------- 

(1 row) 

Questo perché SQL ritiene NULL = NULL essere Sconosciuto (cioè NULL). Vedi functions-comparison. Se si vuole array_search essere in grado di trovare NULL elementi, modificare

 WHERE $2[i] = $1 

a

 WHERE $2[i] IS NOT DISTINCT FROM $1 
+0

+1 per generate_subscripts() e una risposta molto completa. –

+2

Bella risposta. Questo diventerà più semplice ed efficiente quando PostgreSQL 9.4 aggiungerà le funzioni 'WITH ORDINAL', permettendoti di scrivere' unnest (the_array) WITH ORDINAL'. Forse dovrei scrivere e inviare una funzione 'idx' corretta per 9.4, sebbene ... –

4

Per gli array di interi solo è possibile utilizzare il notevolmente più veloce idx function from the intarray bundled extension.

Questa funzione non è stata generalizzata per supportare tutti i tipi di array ancora, purtroppo, quindi sei bloccato con un approccio SQL molto lento per altri array.

Problemi correlati