dokumentationen rekommenderar
med generate_subscripts
fungera. Funktionen nedan emulerar PHP:s 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;
Detta returnerar indexet för den första matchningen, om det finns. Om du vill ha alla matchningar, ändra helt enkelt RETURNS INT
till RETURNS SETOF INT
. Denna funktion returnerar som den är NULL
om ingen matchning hittas.
Denna funktion fungerar endast med endimensionella arrayer.
Tänk också på att array_search(NULL, a)
returnerar alltid NULL
, även om arrayen innehåller null-element:
> SELECT array_search(null, array[1, 2, null, 4]);
array_search
--------------
(1 row)
Detta beror på att SQL anser NULL = NULL
att vara okänd (dvs. NULL
). Se functions-comparison
. Om du vill ha array_search
för att kunna hitta NULL
element, ändra
WHERE $2[i] = $1
till
WHERE $2[i] IS NOT DISTINCT FROM $1