Vérifier si la valeur existe dans le tableau de Postgres

j'ai besoin d'un moyen de tester si une valeur existe dans un tableau donné. Jusqu'à présent, j'ai trouvé quelque chose comme ça

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

mais je continue à penser qu'il devrait y avoir un moyen plus simple pour cela, je ne peux pas le voir.

Edit: Viens de réaliser que je pourrais faire cela

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

C'est beaucoup mieux et je crois suffira, mais si vous avez d'autres façons de le faire s'il vous plaît partager.

116
demandé sur Mike Starov 2012-06-27 21:07:40

5 réponses

plus simple avec le ANY construire :

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

l'opérande de droite de ANY (entre parenthèses) peut être un ensemble (résultat d'un sous-ensemble, par exemple) ou an array . Il y a plusieurs façons de l'utiliser:

Important différence: opérateurs de réseau ( <@ , @> et al.) s'attendre à array types d'opérandes et soutien GIN ou GiST indices dans la distribution standard de PostgreSQL, tandis que le ANY construire s'attend à une élément type comme opérande de gauche et ne prend pas en charge ces indices. Exemple:

rien de tout cela ne fonctionne pour les éléments NULL . Pour tester NULL :

208
répondu Erwin Brandstetter 2017-05-23 12:34:35

attention au piège dans lequel je suis entré: en vérifiant si une certaine valeur n'est pas présente dans un tableau, vous ne devriez pas faire:

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

mais utiliser

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

à la place.

55
répondu murison 2013-09-07 14:52:23

mais si vous avez d'autres façons de le faire s'il vous plaît partager.

Vous pouvez comparer deux tableaux. Si l'une des valeurs du tableau de gauche chevauche les valeurs du tableau de droite, alors elle retourne true. C'est un peu hackish, mais ça marche.

SELECT '{1}'   && '{1,2,3}'::int[];  -- true
SELECT '{1,4}' && '{1,2,3}'::int[];  -- true
SELECT '{4}'   && '{1,2,3}'::int[];  -- false
  • dans la première et la deuxième requête, la valeur 1 est dans le tableau de droite
  • notez que la seconde requête est true , même bien que la valeur 4 ne soit pas contenue dans le tableau de droite
  • pour la troisième requête, aucune valeur dans le tableau de gauche (i.e., 4 ) sont dans le tableau de droite, donc il retourne false
13
répondu vol7ron 2015-07-29 00:10:19

unnest peut être utilisé aussi. Il étend le tableau à un ensemble de lignes et ensuite simplement vérifier une valeur existe ou non est aussi simple que d'utiliser IN ou NOT IN .

p.ex.

  1. id = > uuid

  2. exception_list_ids = > uuid []

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

0
répondu pg2286 2017-08-08 23:15:27

Lorsqu'on cherche l'existence d'un élément dans un réseau, un moulage approprié est requis pour passer L'analyseur SQL de postgres. Voici un exemple de requête utilisant le tableau opérateur contains dans la clause join:

par souci de simplicité, je n'en énumère que la partie pertinente:

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

la partie de jonction de SQL montré

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

fonctionne également

on t2.panel = ANY(t1.other_name)

je suppose que le supplément le moulage est nécessaire parce que l'analyse n'a pas à aller chercher la définition de table pour représenter le type exact de la colonne. D'autres s'il vous plaît commenter sur ce.

0
répondu Kemin Zhou 2017-11-01 20:49:07