PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Ermitteln der Position eines Werts in PostgreSQL-Arrays

Die Dokumentation empfiehlt mit generate_subscripts Funktion. Die folgende Funktion emuliert PHPs 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;

Dies gibt den Index der ersten Übereinstimmung zurück, falls vorhanden. Wenn Sie alle Übereinstimmungen wollen, ändern Sie einfach RETURNS INT zu RETURNS SETOF INT . Diese Funktion gibt unverändert NULL zurück wenn keine Übereinstimmung gefunden wird.

Diese Funktion funktioniert nur mit eindimensionalen Arrays.

Denken Sie auch daran, dass array_search(NULL, a) gibt immer NULL zurück , auch wenn das Array Null-Elemente enthält:

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

(1 row)

Dies liegt daran, dass SQL NULL = NULL berücksichtigt unbekannt sein (d.h. NULL ). Siehe Funktionsvergleich . Wenn Sie array_search möchten um NULL finden zu können Elemente, ändern

     WHERE $2[i] = $1

zu

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