(Noch IN
noch ANY
is een "operator". Een "construct" of "syntaxiselement".)
Logisch , onder verwijzing naar de handleiding:
IN
is gelijk aan = ANY
.
Maar er zijn twee syntaxisvarianten van IN
en twee varianten van ANY
. Details:
- Hoe gebruik je ANY in plaats van IN in een WHERE-clausule met Rails?
IN
een set nemen is gelijk aan = ANY
een set nemen , zoals hier gedemonstreerd:
- postgreSQL - in vs elke
Maar de tweede variant van de een is niet gelijk aan de ander. De tweede variant van de ANY
constructie neemt een matrix (moet een echt arraytype zijn), terwijl de tweede variant van IN
neemt een door komma's gescheiden lijst met waarden . Dit leidt tot verschillende beperkingen bij het doorgeven van waarden en kan leiden in speciale gevallen ook tot verschillende zoekplannen:
- Index niet gebruikt met
=any()
maar gebruikt metin
- Meerdere sets of arrays van waarden doorgeven aan een functie
- Hoe koppel je elementen in een array van samengestelde typen aan elkaar?
ANY
is veelzijdiger
De ANY
construct is veel veelzijdiger, omdat het kan worden gecombineerd met verschillende operators, niet alleen =
. Voorbeeld:
SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');
Voor een groot aantal waarden, een set schaalt beter voor elk:
- Een Postgres-query optimaliseren met een grote IN
Gerelateerd:
- Kunnen PostgreSQL matrixkolommen indexeren?
Omkering / tegengestelde / uitsluiting
"Zoek rijen waar id
staat in de opgegeven array":
SELECT * FROM tbl WHERE id = ANY (ARRAY[1, 2]);
Inversie:"Zoek rijen waar id
is niet in de 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 drie gelijkwaardig. De eerste met array-constructor, de andere twee met array letterlijk. Het datatype kan ondubbelzinnig uit de context worden afgeleid. Anders kan een expliciete cast vereist zijn, zoals '{1,2}'::int[]
.
Rijen met id IS NULL
geef geen van beide uitdrukkingen door. Om NULL
op te nemen waarden aanvullend:
SELECT * FROM tbl WHERE (id = ANY ('{1, 2}')) IS NOT TRUE;