PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

IN kontra DOWOLNY operator w PostgreSQL

(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 z in
  • 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;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Django cache.set() powodujący błąd zduplikowanego klucza

  2. Chcę pobrać dane z innej nazwy tabeli za pomocą funkcji postgresql

  3. Wyrażenie regularne w klauzuli PostgreSQL LIKE

  4. Jak zapisywać dane z tabel R do PostgreSQL za pomocą autoinkrementacji klucza podstawowego?

  5. Opcje wielodostępności dla PostgreSQL