PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Trouver la position d'une valeur dans les tableaux PostgreSQL

La documentation recommande en utilisant le generate_subscripts fonction. La fonction ci-dessous émule le array_search de 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;

Cela renvoie l'index de la première correspondance, s'il est présent. Si vous voulez toutes les correspondances, changez simplement RETURNS INT à RETURNS SETOF INT . Cette fonction, telle quelle, renvoie NULL si aucune correspondance n'est trouvée.

Cette fonction ne fonctionne qu'avec des tableaux unidimensionnels.

Gardez également à l'esprit que array_search(NULL, a) renvoie toujours NULL , même si le tableau contient des éléments nuls :

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

(1 row)

C'est parce que SQL considère NULL = NULL être inconnu (c'est-à-dire NULL ). Voir fonctions-comparison . Si vous voulez array_search pour pouvoir trouver NULL éléments, modifier

     WHERE $2[i] = $1

à

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