Was ist der Unterschied zwischen dem Operator IN
und ANY
in PostgreSQL?
Der Arbeitsmechanismus beider scheint der gleiche zu sein. Kann jemand dies mit einem Beispiel erklären?
Logisch, nter Bezugnahme auf das Handbuch :
IN
entspricht= ANY
.
Es gibt aber zwei Syntaxvarianten von IN
und zwei Varianten von ANY
bauen. Einzelheiten:
Die IN ()
-Variante , die ein set annimmt, entspricht = ANY()
taking a set, wie hier gezeigt:
Aber die zweite Variante von jeder ist nicht äquivalent zu der anderen . Die zweite Variante des Konstrukts ANY
verwendet ein Array (muss ein tatsächlicher Array-Typ sein), während die zweite Variante von IN
verwendet eine durch Kommas getrennte Liste von Werten . Dies führt zu unterschiedlichen Einschränkungen bei der Übergabe von Werten und kann in besonderen Fällen auch zu unterschiedlichen Abfrageplänen:
=any()
verwendet, sondern mit in
Das Konstrukt ANY
ist viel vielseitiger, da es mit verschiedenen Operatoren kombiniert werden kann, nicht nur mit =
. Beispiel für LIKE
:
SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');
Wenn Sie eine große Anzahl von Werten angeben, skaliert set für jeden Wert besser:
Verbunden:
Die Inversion von:
SELECT * FROM foo WHERE id = ANY (ARRAY[1, 2]);
"Finde Zeilen, in denen id
nicht im Array ist" - ist:
SELECT * FROM foo WHERE id <> ALL (ARRAY[1, 2]);
Welches ist das gleiche wie:
SELECT * FROM foo WHERE NOT (id = ANY (ARRAY[1, 2]));
Zeilen mit id IS NULL
übergeben keinen dieser Ausdrücke. Um zusätzlich NULL
Werte einzuschließen:
SELECT * FROM foo WHERE (id = ANY (ARRAY[1, 2])) IS NOT TRUE;