Документация рекомендует с использованием функции generate_subscripts
.Приведенная ниже функция эмулирует PHP 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;
. Возвращает индекс первого совпадения, если таковой имеется.Если вы хотите все совпадения, просто измените RETURNS INT
на RETURNS SETOF INT
.Эта функция, как есть, возвращает NULL
, если совпадение не найдено.
Эта функция работает только с одномерными массивами.
Также имейте в виду, что array_search(NULL, a)
всегда возвращает NULL
, даже если массив содержит нулевые элементы:
> SELECT array_search(null, array[1, 2, null, 4]);
array_search
--------------
(1 row)
Это связано с тем, что SQL считает NULL = NULL
неизвестным (т.е. NULL
).Смотрите функции-сравнения .Если вы хотите, чтобы array_search
мог найти NULL
элементов, измените
WHERE $2[i] = $1
на
WHERE $2[i] IS NOT DISTINCT FROM $1