Er zijn twee varianten van IN uitdrukkingen:
expression IN (subquery)expression IN (value [, ...])
Evenzo zijn twee varianten met de ANY constructie:
expression operator ANY (subquery)expression operator ANY (array expression)
Een subquery werkt voor beide technieken, maar voor de tweede vorm van elk, IN verwacht een lijst met waarden (zoals gedefinieerd in standaard SQL) terwijl = ANY verwacht een array .
Welke te gebruiken?
ANY is een latere, meer veelzijdige toevoeging, het kan worden gecombineerd met elke binaire operator die een booleaanse waarde retourneert. IN brandt af tot een speciaal geval van ANY . In feite is de tweede vorm intern herschreven:
IN is herschreven met = ANY NOT IN is herschreven met <> ALL
Controleer de EXPLAIN output voor elke vraag om voor jezelf te zien. Dit bewijst twee dingen:
INkan nooit sneller zijn dan= ANY.= ANYzal niet substantieel sneller zijn.
De keuze moet worden bepaald door wat gemakkelijker te verstrekken is :een lijst met waarden of een array (mogelijk als letterlijke array - een enkele waarde).
Als de ID's die u gaat doorgeven van binnen de DB komen hoe dan ook, het is veel efficiënter om ze direct te selecteren (subquery) of de brontabel in de query te integreren met een JOIN (zoals @mu heeft gereageerd).
Een lange lijst doorgeven van de waarden van uw klant en behaal de beste prestaties , gebruik een array, unnest() en join, of geef het op als tabelexpressie met behulp van VALUES (zoals @PinnyM heeft gereageerd). Maar houd er rekening mee dat een JOIN behoudt mogelijke duplicaten in de opgegeven array / set while IN of = ANY Niet doen. Meer:
- Een Postgres-query optimaliseren met een grote IN
In aanwezigheid van NULL-waarden, NOT IN is vaak de verkeerde keuze en NOT EXISTS zou gelijk hebben (en ook sneller):
- Selecteer rijen die niet aanwezig zijn in een andere tabel
Syntaxis voor = ANY
Voor de array-expressie accepteert Postgres:
- een matrixconstructor (array is opgebouwd uit een lijst met waarden aan de Postgres-zijde) van de vorm:
ARRAY[1,2,3] - of een array letterlijke van de vorm
'{1,2,3}'.
Om ongeldige typecasts te voorkomen, kunt u expliciet casten:
ARRAY[1,2,3]::numeric[]
'{1,2,3}'::bigint[]
Gerelateerd:
- PostgreSQL:probleem met het doorgeven van array aan procedure
- Hoe een aangepast type array door te geven aan de Postgres-functie
Of je zou maak een Postgres-functie met een VARIADIC parameter, die individuele argumenten aanneemt en daaruit een array vormt:
- Meerdere waarden doorgeven in één parameter
Hoe de array doorgeven van Ruby?
Ervan uitgaande dat id integer zijn :
MyModel.where('id = ANY(ARRAY[?]::int[])', ids.map { |i| i})
Maar ik ben gewoon aan het ploeteren in Ruby. @mu geeft gedetailleerde instructies in dit gerelateerde antwoord:
- Een array met waarden verzenden naar een sql-query in ruby?