Basé sur la partie du message d'erreur operator does not exist: integer = integer[] , il apparaît que le bs la colonne doit être unnest ed, afin de ramener le côté droit à un integer afin que l'opérateur de comparaison puisse être trouvé :
WITH bar AS (
SELECT array_agg(b) AS bs
FROM foo
WHERE c < 3
)
SELECT a
FROM foo
WHERE b = ANY ( SELECT unnest(bs) FROM bar);
Cela se traduit par la sortie :
A
2
3
Étant donné la doc pour la fonction ANY :
... l'erreur est logique, car l'expression de gauche est un integer -- colonne b -- tandis que l'expression de droite est un tableau d'integer s, ou integer[] , et donc la comparaison finit par être de la forme integer =integer[] , qui n'a pas d'opérateur, et génère donc l'erreur.
unnest l'integer[] value rend les expressions de gauche et de droite integer s, et ainsi la comparaison peut continuer.
SQL Fiddle modifié .
Remarque : que le même comportement est observé lors de l'utilisation de IN au lieu de = ANY .