En utilisant Postgres 9.0, 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 n'arrête pas de penser qu'il devrait y avoir un moyen plus simple, je ne peux pas le voir. Cela semble mieux:
select '{1,2,3}'::int[] @> ARRAY[value_variable::int]
Je pense que cela suffira. Mais si vous avez d'autres moyens de le faire, partagez-le!
la source
ANY/ALL (array) requires array on right side
, l'ajout de a::int[]
fait le charme.'something' = ANY(some_array)
peut également être utilisé dans uneWHERE
clause. Pour des raisons connues uniquement de Crom, j'ai passé les quatre dernières années à penser que je ne pouvais pas utiliser de comparateurs de tableaux dans lesWHERE
clauses. Ces jours sont révolus maintenant. (J'étais tombé sur la tête quand j'étais enfant, alors c'est peut-être juste moi)boolean
expression fonctionne dans laWHERE
clause - Crom voulant.Méfiez-vous du piège dans lequel je suis entré: lorsque vous vérifiez si une certaine valeur n'est pas présente dans un tableau, vous ne devriez pas faire:
mais utilisez
au lieu.
la source
ALL
vsANY
SELECT NOT value_variable = ANY('{1,2,3}'::int[])
pourrait être plus lisibleVous pouvez comparer deux tableaux. Si l'une des valeurs du tableau de gauche chevauche les valeurs du tableau de droite, elle renvoie true. C'est un peu hackish, mais ça marche.
1
est dans le bon tableautrue
, même si la valeur4
n'est pas contenue dans le bon tableau4
) n'est dans le tableau de droite, donc il renvoiefalse
la source
unnest
peut également être utilisé. Il étend le tableau à un ensemble de lignes, puis vérifier simplement qu'une valeur existe ou non est aussi simple que d'utiliserIN
ouNOT IN
.par exemple
id => uuid
exception_list_ids => uuid []
select * from table where id NOT IN (select unnest(exception_list_ids) from table2)
la source
Lors de la recherche de l'existence d'un élément dans un tableau, une conversion appropriée est requise pour passer l'analyseur SQL de postgres. Voici un exemple de requête utilisant un tableau contenant un opérateur dans la clause de jointure:
Pour simplifier, je ne liste que la partie pertinente:
La partie jointure de SQL affichée
Ce qui suit fonctionne également
Je suppose juste que le casting supplémentaire est nécessaire car l'analyse n'a pas besoin de récupérer la définition de la table pour déterminer le type exact de la colonne. D'autres s'il vous plaît commenter à ce sujet.
la source
Salut celui-là fonctionne bien pour moi, peut-être utile pour quelqu'un
sélectionnez * dans votre_table où array_column :: text ilike ANY (ARRAY ['% text_to_search%' :: text]);
la source