Expressão
select array_agg(4)
retorna conjunto de linhas (na verdade, conjunto de linhas com 1 linha). Daí a consulta select *
from b
where b.id = any (select array_agg(4)) -- ERROR
tenta comparar um inteiro (b.id) com um valor de uma linha (que tem 1 coluna do tipo integer[]). Ele gera um erro.
Para corrigi-lo, você deve usar uma subconsulta que retorne inteiros (não matrizes de inteiros):
select *
from b
where b.id = any (select unnest(array_agg(4)))
Alternativamente, você pode colocar o nome da coluna do resultado de
select array_agg(4)
como um argumento de any
, por exemplo.: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)
Mais formalmente, as duas primeiras consultas usam
ANY
do formulário:expression operator ANY (subquery)
e os outros dois usam
expression operator ANY (array expression)
como descrito na documentação:9.22.4. QUALQUER/ALGUMA e 9.23.3. ANY/SOME (matriz) .