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:
IN
kan nooit sneller zijn dan= ANY
.= ANY
zal 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?