2012-01-10 13 views

Odpowiedz

9

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.

27

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 
+0

+1 dla generate_subscripts() i bardzo kompletna odpowiedź. –

+2

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ż ... –

4

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.

Powiązane problemy