wake-up-neo.com

IN vs JEDER Operator in PostgreSQL

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?

77
mrg

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:


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:

Inversion/Gegenteil/Ausschluss

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