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