it-swarm.com.de

Prüfen Sie, ob ein Wert im Postgres-Array vorhanden ist

Ich brauche einen Weg, um zu testen, ob ein Wert in einem gegebenen Array vorhanden ist. Bisher habe ich mir so etwas ausgedacht

select '{1,2,3}'::int[] @> (ARRAY[]::int[] || value_variable::int)

aber ich denke immer, dass es einen einfacheren Weg geben sollte, ich kann es einfach nicht sehen.

Edit: Mir wurde gerade klar, dass ich das schaffen könnte

select '{1,2,3}'::int[] @> ARRAY[value_variable::int]

Das ist viel besser und ich glaube, es genügt, aber wenn Sie andere Möglichkeiten haben, teilen Sie uns dies bitte mit. 

129
Mike Starov

Einfacher mit dem ANY -Konstrukt :

SELECT value_variable = ANY ('{1,2,3}'::int[])

Der rechte Operand von ANY (zwischen Klammern) kann entweder eine Menge sein (beispielsweise das Ergebnis einer Unterabfrage)oder an array . Es gibt mehrere Möglichkeiten, es zu benutzen:

Important Unterschied: Array-Operatoren (<@, @> et al.) expect array-Typen als Operanden und unterstützen GIN- oder Gist-Indizes in der Standardverteilung von PostgreSQL, während Das Konstrukt ANY erwartet einen Typ Element als linken Operanden und unterstützt diese Indizes nicht. Beispiel:

Nichts davon funktioniert für NULL Elemente. So testen Sie NULL:

236

Achten Sie auf die Falle, in die ich geraten bin: Wenn Sie überprüfen, ob bestimmte Werte in einem Array nicht vorhanden sind, sollten Sie Folgendes tun: 

SELECT value_variable != ANY('{1,2,3}'::int[])

aber verwenden 

SELECT value_variable != ALL('{1,2,3}'::int[])

stattdessen.

66
murison

wenn Sie jedoch andere Möglichkeiten haben, teilen Sie dies bitte mit. 

Sie können zwei Arrays vergleichen. Wenn einer der Werte im linken Array die Werte im rechten Array überlappt, wird true zurückgegeben. Es ist irgendwie hackig, aber es funktioniert.

SELECT '{1}'   && '{1,2,3}'::int[];  -- true
SELECT '{1,4}' && '{1,2,3}'::int[];  -- true
SELECT '{4}'   && '{1,2,3}'::int[];  -- false
  • In der ersten und zweiten Abfrage befindet sich der Wert 1 im rechten Array
  • Beachten Sie, dass die zweite Abfrage true ist, obwohl der Wert 4 nicht im rechten Array enthalten ist
  • Bei der dritten Abfrage befinden sich keine Werte im linken Array (d. H. 4) im rechten Array. Es wird also false zurückgegeben.
18
vol7ron

unnest kann ebenfalls verwendet werden. Es erweitert das Array auf eine Reihe von Zeilen und überprüft dann einfach, ob ein Wert vorhanden ist oder nicht, indem Sie IN oder NOT IN Verwenden.

z.B.

  1. id => uuid

  2. exception_list_ids => uuid []

select * from table where id NOT IN (select unnest(exception_list_ids) from table2)

2
pg2286

Wenn Sie nach einem Element in einem Array suchen, ist ein ordnungsgemäßes Casting erforderlich, um den SQL-Parser von Postgres zu übergeben. Hier ein Beispiel für eine Abfrage, die den Array-Operator in der Join-Klausel verwendet:

Zur Vereinfachung liste ich nur den relevanten Teil auf:

table1 other_name text[]; -- is an array of text

Der Join-Teil von SQL wird angezeigt

from table1 t1 join table2 t2 on t1.other_name::text[] @> ARRAY[t2.panel::text]

Folgendes funktioniert auch

on t2.panel = ANY(t1.other_name)

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.

0
Kemin Zhou