sql >> Database >  >> RDS >> PostgreSQL

IN vs ELKE operator in PostgreSQL

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


  1. probleem met to_date functie met sysdate

  2. Hoe maak je een primaire sleutel in SQL

  3. Paging implementeren met behulp van OFFSET FETCH NEXT in SQL Server

  4. Voorbeelden van het converteren van 'date' naar 'smalldatetime' in SQL Server (T-SQL)