sql >> Database >  >> RDS >> PostgreSQL

Hoe gebruik je ANY in plaats van IN in een WHERE-clausule met Rails?

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?



  1. MVP-top 2013:een korte terugblik en een vooruitblik

  2. Query verwijderen en vernieuwen in ListView in Android (sqlite)

  3. Hoe gefilterde indexen een krachtigere functie kunnen zijn

  4. Hoe maak ik verbinding met een Oracle Database in R?