Espressione select array_agg(4)
restituisce set di righe (in realtà set di righe con 1 riga). Da qui la domanda
select *
from b
where b.id = any (select array_agg(4)) -- ERROR
tenta di confrontare un intero (b.id) con un valore di una riga (che ha 1 colonna di tipo integer[]). Genera un errore.
Per risolverlo dovresti usare una sottoquery che restituisce interi (non array di interi):
select *
from b
where b.id = any (select unnest(array_agg(4)))
In alternativa, puoi inserire il nome della colonna del risultato di select array_agg(4)
come argomento di any
, ad esempio:
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)
Più formalmente, le prime due query utilizzano ANY
del modulo:
expression operator ANY (subquery)
e gli altri due usano
expression operator ANY (array expression)
come descritto nella documentazione:9.22.4. QUALSIASI/ALCUNE e 9.23.3. QUALSIASI/ALCUNI (array) .