(Ani IN
ani ANY
jest „operatorem”. „Konstrukcja” lub „element składni”.)
logicznie , cytując instrukcję:
IN
jest odpowiednikiem = ANY
.
Ale są dwa warianty składni z IN
i dwa warianty ANY
. Szczegóły:
- Jak używać ANY zamiast IN w klauzuli WHERE w Railsach?
IN
przyjmowanie zestawu jest odpowiednikiem = ANY
biorąc zestaw , jak pokazano tutaj:
- postgreSQL — w kontrach do dowolnego
Ale drugi wariant każdego z nich nie jest równoważny drugiemu. Drugi wariant ANY
konstrukcja przyjmuje tablicę (musi być rzeczywistym typem tablicy), podczas gdy drugi wariant IN
przyjmuje listę wartości rozdzielonych przecinkami . Prowadzi to do różnych ograniczeń w przekazywaniu wartości i może prowadzą również do różnych planów zapytań w szczególnych przypadkach:
- Indeks nie jest używany z
=any()
ale używane zin
- Przekaż wiele zestawów lub tablic wartości do funkcji
- Jak dopasować elementy w tablicy typu złożonego?
ANY
jest bardziej wszechstronny
ANY
konstrukcja jest znacznie bardziej wszechstronna, ponieważ można ją łączyć z różnymi operatorami, a nie tylko =
. Przykład:
SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');
Dla dużej liczby wartości, dostarczając zestaw skaluje się lepiej dla każdego:
- Optymalizacja zapytania Postgres z dużym IN
Powiązane:
- Czy PostgreSQL może indeksować kolumny tablicy?
Odwrócenie / przeciwieństwo / wykluczenie
"Znajdź wiersze, w których id
znajduje się w podanej tablicy:
SELECT * FROM tbl WHERE id = ANY (ARRAY[1, 2]);
Inwersja:"Znajdź wiersze, w których id
jest nie w tablicy:
SELECT * FROM tbl WHERE id <> ALL (ARRAY[1, 2]);
SELECT * FROM tbl WHERE id <> ALL ('{1, 2}'); -- equivalent array literal
SELECT * FROM tbl WHERE NOT (id = ANY ('{1, 2}'));
Wszystkie trzy równoważne. Pierwszy z konstruktorem tablicowym, pozostałe dwa z literałem tablicowym. Typ danych można jednoznacznie wyprowadzić z kontekstu. W przeciwnym razie może być wymagane jawne rzutowanie, takie jak '{1,2}'::int[]
.
Wiersze z id IS NULL
nie przekazuj żadnego z tych wyrażeń. Aby uwzględnić NULL
wartości dodatkowo:
SELECT * FROM tbl WHERE (id = ANY ('{1, 2}')) IS NOT TRUE;