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. znajdowanie najbliższych pozycji na dwóch listach/tablicach w Pythonie
- 2. Znajdowanie pozycji myszy względem panelu
- 3. Znajdź liczbę 1s w tej samej pozycji w dwóch tablicach
- 4. Znajdź indeksy wspólnych wartości w dwóch tablicach.
- 5. Znajdowanie najbliższej wartości w data.table
- 6. znajdowanie ostatniego wystąpienia pozycji na liście python
- 7. Znajdowanie wszystkich pozycji podciągu w większym ciągu w języku C#
- 8. Znajdowanie wzorca w zestawie wartości w Javie
- 9. Julia: Przypisanie w tablicach
- 10. Znajdowanie wartości null w łańcuchu wywołań metod
- 11. Znajdowanie wartości odstających w zestawie danych
- 12. Znajdowanie flagi najwyższego zestawu w wartości wyliczeniowej
- 13. Ignoring -Inf wartości w tablicach używających numpy/scipy w Pythonie
- 14. W jaki sposób program gtest porównuje wartości w dwóch tablicach?
- 15. Następujące generowanie wartości postgresql
- 16. Pętla PHP w wielowymiarowych tablicach i zmieniaj wartości
- 17. Dziwne przypisanie w tablicach numpy
- 18. Jak używać SQLAlchemy do wybierania wartości na pozycji w PostgreSQL ARRAY?
- 19. Znajdowanie wartości wspólnych dla wszystkich elementów
- 20. PostgreSQL 9.4 - Porównywanie wartości NULL
- 21. Wyzwalacz PostgreSQL do ustawiania wartości
- 22. Znajdowanie nieużywanych obiektów (wartości inne niż pierwotne)
- 23. concat dwie wartości int w postgresql
- 24. Jak mogę znaleźć indeks pozycji listy przy wartości pozycji?
- 25. Znajdowanie zduplikowanych wartości w różnych kolumnach w tym samym wierszu
- 26. Używanie zmiennych losowych w tablicach
- 27. Szybkie i wydajne obliczenia na tablicach
- 28. Operator [] Przeciążanie w wielowymiarowych tablicach C++
- 29. Znajdowanie pierwszej niezerowej wartości wzdłuż osi sortowanej dwuwymiarowej tablicy numpy
- 30. Sumowanie danych XML w dwóch tablicach
+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ż ... –