Mit Postgres 9.0 muss ich testen können, ob in einem bestimmten Array ein Wert vorhanden ist. Bisher habe ich mir so etwas ausgedacht:
select '{1,2,3}'::int[] @> (ARRAY[]::int[] || value_variable::int)
Aber ich denke immer wieder, dass es einen einfacheren Weg geben sollte, ich kann es einfach nicht sehen. Das scheint besser zu sein:
select '{1,2,3}'::int[] @> ARRAY[value_variable::int]
Ich glaube, es wird ausreichen. Aber wenn Sie andere Möglichkeiten haben, teilen Sie dies bitte mit!
quelle
ANY/ALL (array) requires array on right side
, das Add von::int[]
tat der Reiz.'something' = ANY(some_array)
sie auch in einerWHERE
Klausel verwendet werden können. Aus Gründen, die nur Crom bekannt sind, habe ich in den letzten vier Jahren gedacht, dass ich inWHERE
Klauseln keine Array-Komparatoren verwenden könnte . Diese Zeiten sind jetzt vorbei. (Ich wurde als Kind auf den Kopf fallen gelassen, also bin ich es vielleicht nur).boolean
Ausdruck funktioniert in derWHERE
Klausel - Crom will.Achten Sie auf die Falle, in die ich geraten bin: Wenn Sie überprüfen, ob ein bestimmter Wert in einem Array nicht vorhanden ist, sollten Sie Folgendes nicht tun:
aber verwenden
stattdessen.
quelle
ALL
ANY
SELECT NOT value_variable = ANY('{1,2,3}'::int[])
könnte besser lesbar seinSie können zwei Arrays vergleichen. Wenn sich einer der Werte im linken Array mit den Werten im rechten Array überschneidet, wird true zurückgegeben. Es ist irgendwie hackisch, aber es funktioniert.
1
im richtigen Arraytrue
, obwohl der Wert4
nicht im richtigen Array enthalten ist4
) im rechten Array, daher wird zurückgegebenfalse
quelle
unnest
kann auch verwendet werden. Es erweitert das Array auf eine Reihe von Zeilen und die einfache Überprüfung, ob ein Wert vorhanden ist oder nicht, ist so einfach wie die Verwendung vonIN
oderNOT IN
.z.B
id => uuid
exception_list_ids => uuid []
select * from table where id NOT IN (select unnest(exception_list_ids) from table2)
quelle
Wenn Sie nach dem Vorhandensein eines Elements in einem Array suchen, ist eine ordnungsgemäße Umwandlung erforderlich, um den SQL-Parser von postgres zu übergeben. Hier ist eine Beispielabfrage mit Array enthält Operator in der Join-Klausel:
Der Einfachheit halber liste ich nur den relevanten Teil auf:
Der Join-Teil von SQL wird angezeigt
Das Folgende funktioniert auch
Ich vermute nur, dass das zusätzliche Casting erforderlich ist, da die Analyse die Tabellendefinition nicht abrufen muss, um den genauen Typ der Spalte zu ermitteln. Andere kommentieren dies bitte.
quelle
Hallo, das funktioniert gut für mich, vielleicht nützlich für jemanden
Wählen Sie * aus Ihrer_Tabelle aus, wobei array_column :: text wie ANY (ARRAY ['% text_to_search%' :: text]);
quelle