So verwenden Sie ANY anstelle von IN in der WHERE-Klausel
Angenommen, Sie haben eine Abfrage wie MyModel.where(id: ids)
in Rails, die SQL mithilfe von IN generiert, das eine Liste von IDs enthält:
<code class="language-sql">SELECT "my_models".* FROM "my_models" WHERE "my_models".`"id"` IN (1, 28, 7, 8, 12)</code>
Um ANY anstelle von IN zu verwenden, können Sie Folgendes versuchen:
<code class="language-ruby">MyModel.where("id = ANY(VALUES(#{ids.join '),('}))")</code>
Wenn das Array ids
jedoch leer ist, schlägt dieser Ansatz fehl und führt zu einem SQL-Syntaxfehler.
IN und ANY verstehen
IN- und ANY-Ausdrücke haben zwei Formen:
expression IN (subquery)
expression IN (value [, ...])
oder expression ANY (array expression)
Für die zweite Form erwartet IN eine Liste von Werten, während ANY ein Array erwartet.
Wann ANY und IN verwendet werden sollten
ANY ist eine allgemeinere Option, die mit jedem Operator verwendet werden kann, der einen booleschen Wert zurückgibt. IN ist ein Sonderfall von ANY.
In Bezug auf die Leistung ist ANY nie schneller als = ANY
und = ANY
ist nicht viel schneller als IN. Die Wahl sollte auf Bequemlichkeit basieren.
Wenn die ID aus einer Datenbank stammt, ist es effizienter, eine Unterabfrage oder JOIN zu verwenden. Um die beste Leistung bei der Übergabe langer Wertelisten vom Client zu erzielen, sollten Sie die Verwendung von Arrays, unnest()
oder VALUES-Ausdrücken in Betracht ziehen.
= Syntax von ANY
Postgres akzeptiert die folgenden Formen von Array-Ausdrücken:
ARRAY[1,2,3]
{1,2,3}
Um eine Typkonvertierung zu vermeiden, wandeln Sie das Array explizit um: ARRAY[1,2,3]::numeric[]
.
So übergeben Sie ein Array von Ruby
Angenommen, id
ist eine ganze Zahl:
<code class="language-ruby">MyModel.where('id = ANY(ARRAY[?]::int[])', ids.map { |i| i})</code>
Das obige ist der detaillierte Inhalt vonWann sollte ich in einer WHERE-Klausel ANY anstelle von IN verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!