(Ingen IN
heller ikke ANY
er en "operatør". Et "konstruktion" eller "syntakselement".)
Logisk , med henvisning til manualen:
IN
svarer til = ANY
.
Men der er to syntaksvarianter af IN
og to varianter af ANY
. Detaljer:
- Hvordan bruger man ANY i stedet for IN i en WHERE-sætning med Rails?
IN
at tage et sæt svarer til = ANY
tager et sæt , som vist her:
- postgreSQL - in vs any
Men den anden variant af hver er ikke ækvivalent med den anden. Den anden variant af ANY
konstruktion tager en matrix (skal være en faktisk matrixtype), mens den anden variant af IN
tager en kommasepareret liste over værdier . Dette fører til forskellige begrænsninger i at overføre værdier og kan også føre til forskellige forespørgselsplaner i særlige tilfælde:
- Indeks bruges ikke med
=any()
men brugt medin
- Send flere sæt eller arrays af værdier til en funktion
- Hvordan matcher man elementer i en række af sammensatte typer?
ANY
er mere alsidig
ANY
konstruktionen er langt mere alsidig, da den kan kombineres med forskellige operatorer, ikke kun =
. Eksempel:
SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');
For et stort antal værdier skal du angive et sæt skalerer bedre for hver:
- Optimering af en Postgres-forespørgsel med en stor IN
Relateret:
- Kan PostgreSQL indeksere array-kolonner?
Inversion / modsat / ekskludering
"Find rækker, hvor id
er i det givne array":
SELECT * FROM tbl WHERE id = ANY (ARRAY[1, 2]);
Inversion:"Find rækker hvor id
er ikke i arrayet":
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 tre tilsvarende. Den første med array-konstruktør, de to andre med array-literal. Datatypen kan udledes entydigt fra kontekst. Ellers kan en eksplicit cast være påkrævet, såsom '{1,2}'::int[]
.
Rækker med id IS NULL
bestå ikke nogen af disse udtryk. At inkludere NULL
værdier yderligere:
SELECT * FROM tbl WHERE (id = ANY ('{1, 2}')) IS NOT TRUE;