Vom feinen Array Operators manual:
Betreiber: @>
Beschreibung: enthält
Beispiel: ARRAY[1,4,3] @> ARRAY[3,1]
Ergebnis: t
(AKA wahr)
So @>
behandelt seine Operanden-Arrays als Sätze und prüft, ob die rechte Seite eine Teilmenge der linken Seite .
IN
ist ein wenig anders und wird verwendet, mit subqueries:
9.22.2. IN
expression IN (subquery)
Die rechte Seite ist eine geklammerte Unterabfrage, die genau eine Spalte zurückkehren. Der linke Ausdruck wird ausgewertet und mit jeder Zeile des Unterabfrageergebnisses verglichen. Das Ergebnis von IN
ist "wahr", wenn eine Zeile gleicher Unterabfrage gefunden wird. Das Ergebnis ist "false", wenn keine gleiche Zeile gefunden wird (einschließlich des Falls, in dem die Unterabfrage keine Zeilen zurückgibt).
oder mit literal lists:
9.23.1. IN
expression IN (value [, ...])
Die rechte Seite ist eine geklammerten Liste von skalaren Ausdrücken. Das Ergebnis ist "wahr", wenn das Ergebnis des linken Ausdrucks einem der rechten Ausdrücke entspricht.Dies ist eine Kurzschreibweise für
expression = value1
OR
expression = value2
OR
...
So a IN b
mehr oder weniger Mittel:
Ist der Wert a
gleich einem der Werte in der Liste b
(die eine Abfrage produzieren kann Single Elementzeilen oder eine Literalliste).
Natürlich können Sie sagen Dinge wie:
array[1] in (select some_array from ...)
array[1] in (array[1], array[2,3])
aber die Anordnungen in diesen Fällen sind immer noch wie einzelne Werte behandelt (das nur passieren einige interne Struktur haben).
Wenn Sie überprüfen wollen, ob ein Array beliebige aus einer Liste von Werten enthält dann @>
ist nicht das, was Sie wollen. Bedenken Sie:
array[1,2] @> array[2,4]
4
ist nicht in array[1,2]
so array[2,4]
nicht eine Teilmenge von array[1,2]
ist.
Wenn Sie überprüfen wollen, ob jemand beide Rollen hat dann:
roles @> array['as_champion', 'whatever']
ist der richtige Ausdruck, aber wenn Sie überprüfen möchten, ob roles
ist jede dieser Werte dann wollen Sie die Überlappungen Operator (&&
):
roles && array['as_champion', 'whatever']
Bitte beachte, dass ich mit dem „Array-Konstruktor“ Syntax für die überall Arrays, das ist, weil es ist viel bequemer für die Arbeit mit einem Tool (wie ActiveRecord), das ein Array in eine durch Kommas getrennte Liste erweitern kann, wenn er einen Platzhalter ersetzt, aber SQL-Arrays nicht vollständig versteht.
alles gegeben, können wir sagen Dinge wie:
Membership.where('roles @> array[?]', %w[as_champion whatever])
Membership.where('roles @> array[:roles]', :roles => some_ruby_array_of_strings)
und alles wird wie erwartet. Sie arbeiten immer noch mit kleinen SQL-Snippets (da ActiveRecord SQL-Arrays nicht vollständig versteht oder den Operator @>
darstellt), aber Sie müssen sich zumindest keine Sorgen über Probleme machen. Sie könnten wahrscheinlich durch AREL gehen, um manuell @>
Unterstützung hinzuzufügen, aber ich finde, dass AREL schnell in eine unverständliche und unlesbare Verwirrung für alle außer die trivialsten Verwendungen gerät.
Der Operator '@>' bedeutet "enthält": Es ist wahr, wenn das linke Array alle Elemente im rechten Array enthält. Der Operator "IN" wird mit grundlegenden Datentypen verwendet, nicht mit Arrays. – Andomar
@Andomar nach grundlegenden Datentypen, meinst du "IN" wird nur verwendet, um zu überprüfen, ob ein Wert gleich einer einzelnen Zeichenkette oder Ganzzahl oder etwas in der bereitgestellten Liste ist? Wo als '@>' muss sie alle enthalten? – mackshkatz