Výraz select array_agg(4)
vrátí sadu řádků (ve skutečnosti sadu řádků s 1 řádkem). Proto dotaz
select *
from b
where b.id = any (select array_agg(4)) -- ERROR
pokusí se porovnat celé číslo (b.id) s hodnotou řádku (který má 1 sloupec typu integer[]). Vyvolá chybu.
Chcete-li to opravit, měli byste použít poddotaz, který vrací celá čísla (ne pole celých čísel):
select *
from b
where b.id = any (select unnest(array_agg(4)))
Případně můžete umístit název sloupce výsledku select array_agg(4)
jako argument any
, např.:
select *
from b
cross join (select array_agg(4)) agg(arr)
where b.id = any (arr)
nebo
with agg as (
select array_agg(4) as arr)
select *
from b
cross join agg
where b.id = any (arr)
Více formálně, první dva dotazy používají ANY
formuláře:
expression operator ANY (subquery)
a další dva používají
expression operator ANY (array expression)
jak je popsáno v dokumentaci:9.22.4. JAKÉKOLI/NĚKTERÉ a 9.23.3. JAKÉKOLI/NĚKTERÉ (pole) .