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