sql >> Database teknologi >  >> RDS >> PostgreSQL

IN vs ENHVER operatør i PostgreSQL

(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 med in
  • 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;


  1. MySQL Replication Health Check script

  2. Øjeblikkelig filinitialisering:Virkning under opsætning

  3. Anbefalinger til understøttelse af både Oracle og SQL Server i den samme ASP.NET-app med NHibernate

  4. Hvordan justify_hours() virker i PostgreSQL