(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;