(Inte heller IN
inte heller ANY
är en "operatör". En "konstruktion" eller "syntaxelement".)
Logiskt , med hänvisning till manualen:
IN
motsvarar= ANY
.
Men det finns två syntaxvarianter av IN
och två varianter av ANY
. Detaljer:
- Hur använder man ANY istället för IN i en WHERE-sats med Rails?
IN
ta ett set motsvarar = ANY
tar ett set , som visas här:
- postgreSQL - in vs any
Men den andra varianten av varje är inte likvärdig med den andra. Den andra varianten av ANY
konstruktionen tar en array (måste vara en faktisk matristyp), medan den andra varianten av IN
tar en kommaseparerad värdelista . Detta leder till olika begränsningar i att skicka värden och kan även leda till olika frågeplaner i speciella fall:
- Index används inte med
=any()
men används medin
- Skicka flera uppsättningar eller matriser med värden till en funktion
- Hur matchar man element i en array av sammansatt typ?
ANY
är mer mångsidig
ANY
konstruktionen är mycket mer mångsidig, eftersom den kan kombineras med olika operatorer, inte bara =
. Exempel:
SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');
För ett stort antal värden, tillhandahåll en uppsättning skalar bättre för varje:
- Optimera en Postgres-fråga med ett stort IN
Relaterat:
- Kan PostgreSQL indexera arraykolumner?
Inversion / motsats / uteslutning
"Hitta rader där id
är i den givna arrayen":
SELECT * FROM tbl WHERE id = ANY (ARRAY[1, 2]);
Inversion:"Hitta rader där id
är inte i arrayen":
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}'));
Alla tre likvärdiga. Den första med arraykonstruktor, de andra två med array literal. Datatypen kan härledas från kontexten entydigt. Annars kan en explicit rollbesättning krävas, som '{1,2}'::int[]
.
Rader med id IS NULL
klarar inte något av dessa uttryck. För att inkludera NULL
värden dessutom:
SELECT * FROM tbl WHERE (id = ANY ('{1, 2}')) IS NOT TRUE;