La documentazione consiglia
utilizzando generate_subscripts
funzione. La funzione seguente emula array_search
di PHP :
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 corrispondenza, se presente. Se vuoi tutte le corrispondenze, cambia semplicemente RETURNS INT
a RETURNS SETOF INT
. Questa funzione, così com'è, restituisce NULL
se non viene trovata alcuna corrispondenza.
Questa funzione funziona solo con array unidimensionali.
Inoltre, tieni 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 considera NULL = NULL
essere sconosciuto (cioè NULL
). Vedi confronto-funzioni
. Se vuoi array_search
per poter trovare NULL
elementi, cambia
WHERE $2[i] = $1
a
WHERE $2[i] IS NOT DISTINCT FROM $1