PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

IN vs. ANY-Operator in PostgreSQL

(Weder IN noch ANY ist ein „Operator“. Ein "Konstrukt" oder "Syntaxelement".)

Logisch , das Handbuch zitierend:

IN entspricht = ANY .

Aber es gibt zwei Syntaxvarianten von IN und zwei Varianten von ANY . Einzelheiten:

  • Wie verwendet man ANY statt IN in einer WHERE-Klausel mit Rails?

IN einen Satz nehmen entspricht = ANY einen Satz nehmen , wie hier gezeigt:

  • postgreSQL - in vs. beliebig

Aber die jeweils zweite Variante ist nicht äquivalent zur anderen. Die zweite Variante des ANY Konstrukt nimmt ein Array (muss ein tatsächlicher Array-Typ sein), während die zweite Variante von IN nimmt eine durch Kommas getrennte Liste von Werten . Dies führt zu unterschiedlichen Einschränkungen bei der Übergabe von Werten und kann führen in Sonderfällen auch zu unterschiedlichen Abfrageplänen:

  • Index wird nicht mit =any() verwendet aber mit in verwendet
  • Übergeben Sie mehrere Sätze oder Arrays von Werten an eine Funktion
  • Wie gleicht man Elemente in einem Array vom zusammengesetzten Typ ab?

ANY ist vielseitiger

Der ANY Konstrukt ist viel vielseitiger, da es mit verschiedenen Operatoren kombiniert werden kann, nicht nur mit = . Beispiel:

SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');

Für eine große Anzahl von Werten, Bereitstellung eines Sets skaliert besser für jeden:

  • Optimieren einer Postgres-Abfrage mit einem großen IN

Verwandte:

  • Kann PostgreSQL Array-Spalten indizieren?

Umkehrung / Gegenteil / Ausschluss

"Zeilen suchen, in denen id befindet sich im angegebenen Array":

SELECT * FROM tbl WHERE id = ANY (ARRAY[1, 2]);

Inversion:"Finde Zeilen, in denen id ist nicht im Array":

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}'));

Alle drei gleichwertig. Der erste mit Array-Konstruktor, die anderen beiden mit Array-Literal. Der Datentyp lässt sich eindeutig aus dem Kontext ableiten. Andernfalls kann eine explizite Umwandlung erforderlich sein, wie '{1,2}'::int[] .

Zeilen mit id IS NULL Übergeben Sie keinen dieser Ausdrücke. Um NULL einzuschließen Werte zusätzlich:

SELECT * FROM tbl WHERE (id = ANY ('{1, 2}')) IS NOT TRUE;