Expresión select array_agg(4)
devuelve un conjunto de filas (en realidad, un conjunto de filas con 1 fila). De ahí la consulta
select *
from b
where b.id = any (select array_agg(4)) -- ERROR
intenta comparar un número entero (b.id) con el valor de una fila (que tiene 1 columna de tipo entero[]). Genera un error.
Para solucionarlo, debe usar una subconsulta que devuelva números enteros (no matrices de números enteros):
select *
from b
where b.id = any (select unnest(array_agg(4)))
Alternativamente, puede colocar el nombre de la columna del resultado de select array_agg(4)
como argumento de any
, por ejemplo:
select *
from b
cross join (select array_agg(4)) agg(arr)
where b.id = any (arr)
o
with agg as (
select array_agg(4) as arr)
select *
from b
cross join agg
where b.id = any (arr)
Más formalmente, las dos primeras consultas usan ANY
de la forma:
expression operator ANY (subquery)
y los otros dos usan
expression operator ANY (array expression)
como se describe en la documentación:9.22.4. CUALQUIERA/ALGUNOS y 9.23.3. CUALQUIERA/ALGUNOS (matriz) .