sql >> Databasteknik >  >> RDS >> PostgreSQL

IN vs ALLA operatör i PostgreSQL

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


  1. Ändra typ av en kolumn med siffror från varchar till int

  2. Använda varchar(MAX) vs TEXT på SQL Server

  3. Blir de snabbare om du lägger till 'LIMIT 1' i MySQL-frågor när du vet att det bara kommer att bli ett resultat?

  4. Automatisera tabellmodellbearbetningen av Analysis Services-databaser (SSAS) i SQL Server