Expression select array_agg(4)
renvoie un ensemble de lignes (en fait un ensemble de lignes avec 1 ligne). D'où la requête
select *
from b
where b.id = any (select array_agg(4)) -- ERROR
essaie de comparer un entier (b.id) à une valeur d'une ligne (qui a 1 colonne de type entier[]). Cela génère une erreur.
Pour résoudre ce problème, vous devez utiliser une sous-requête qui renvoie des entiers (et non des tableaux d'entiers) :
select *
from b
where b.id = any (select unnest(array_agg(4)))
Alternativement, vous pouvez placer le nom de la colonne du résultat de select array_agg(4)
comme argument de any
, par exemple :
select *
from b
cross join (select array_agg(4)) agg(arr)
where b.id = any (arr)
ou
with agg as (
select array_agg(4) as arr)
select *
from b
cross join agg
where b.id = any (arr)
Plus formellement, les deux premières requêtes utilisent ANY
de la forme :
expression operator ANY (subquery)
et les deux autres utilisent
expression operator ANY (array expression)
comme décrit dans la documentation :9.22.4. N'IMPORTE QUEL et 9.23.3. TOUT/CERTAINS (tableau) .