Jak mogę uzyskać pozycję wartości w tablicach PostgreSQL? Jest metoda .index()
dla Pythona i array_search()
dla PHP, ale nie mogę znaleźć żadnej takiej funkcji dla PostgreSQL. Czy powinienem napisać do tego funkcję zapisaną? Wolę rozwiązywać za pomocą wbudowanej funkcji.Znajdowanie pozycji wartości w tablicach PostgreSQL
Odpowiedz
Since version 9.5, wbudowane funkcje: array_position()
i array_positions()
, do wyszukiwania klucza tablicy (tylko pierwsze wystąpienie) lub kluczy (wszystkie wystąpienia), według wartości.
Te funkcje obsługują dowolny typ ramki.
Funkcja documentation recommends przy użyciu funkcji generate_subscripts
. Funkcja poniżej Emulate na 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;
ta zwraca indeks pierwszego meczu, jeśli jest obecny. Jeśli chcesz wszystkie mecze, po prostu zmień RETURNS INT
na RETURNS SETOF INT
. Ta funkcja, jak jest, zwraca NULL
, jeśli nie znaleziono żadnego dopasowania.
Ta funkcja działa tylko z jednowymiarowymi tablicami.
także pamiętać, że array_search(NULL, a)
zawsze zwraca NULL
, nawet jeśli tablica zawiera elementy null:
> SELECT array_search(null, array[1, 2, null, 4]);
array_search
--------------
(1 row)
To dlatego SQL uważa NULL = NULL
być nieznany (tj NULL
). Zobacz functions-comparison. Jeśli chcesz array_search
aby móc znaleźć NULL
elementów, zmień
WHERE $2[i] = $1
do
WHERE $2[i] IS NOT DISTINCT FROM $1
Dla tablic całkowitych tylko można użyć znacznie szybciej idx
function from the intarray
bundled extension.
Ta funkcja nie została jeszcze uogólniona, aby obsługiwać wszystkie typy tablic, niestety, więc utknąłeś z bardzo powolnym podejściem SQL dla innych tablic.
+1 dla generate_subscripts() i bardzo kompletna odpowiedź. –
Dobra odpowiedź. Będzie to prostsze i bardziej wydajne, gdy PostgreSQL 9.4 doda funkcje 'WITH ORDINAL', pozwalając ci po prostu napisać' unnest (the_array) WITH ORDINAL'. Może powinienem napisać i przesłać prawidłową funkcję 'idx' dla 9.4, chociaż ... –