PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Trovare la posizione di un valore negli array PostgreSQL

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