Израз select array_agg(4)
връща набор от редове (всъщност набор от редове с 1 ред). Оттук и заявката
select *
from b
where b.id = any (select array_agg(4)) -- ERROR
опитва да сравни цяло число (b.id) със стойност на ред (който има 1 колона от тип integer[]). Извежда грешка.
За да го коригирате, трябва да използвате подзаявка, която връща цели числа (а не масиви от цели числа):
select *
from b
where b.id = any (select unnest(array_agg(4)))
Като алтернатива можете да поставите името на колоната на резултата от select array_agg(4)
като аргумент на any
, напр.:
select *
from b
cross join (select array_agg(4)) agg(arr)
where b.id = any (arr)
или
with agg as (
select array_agg(4) as arr)
select *
from b
cross join agg
where b.id = any (arr)
По-формално, първите две заявки използват ANY
във формата:
expression operator ANY (subquery)
а другите две използват
expression operator ANY (array expression)
както е описано в документацията:9.22.4. НЯКОИ/НЯКОИ и 9.23.3. ANY/SOME (масив) .