Wyrażenie select array_agg(4)
zwraca zestaw wierszy (w rzeczywistości zestaw wierszy z 1 wierszem). Stąd zapytanie
select *
from b
where b.id = any (select array_agg(4)) -- ERROR
próbuje porównać liczbę całkowitą (b.id) z wartością wiersza (który ma 1 kolumnę typu integer[]). Zgłasza błąd.
Aby to naprawić, powinieneś użyć podzapytania, które zwraca liczby całkowite (nie tablice liczb całkowitych):
select *
from b
where b.id = any (select unnest(array_agg(4)))
Alternatywnie możesz umieścić nazwę kolumny wyniku select array_agg(4)
jako argument any
, np.:
select *
from b
cross join (select array_agg(4)) agg(arr)
where b.id = any (arr)
lub
with agg as (
select array_agg(4) as arr)
select *
from b
cross join agg
where b.id = any (arr)
Bardziej formalnie, pierwsze dwa zapytania używają ANY
postaci:
expression operator ANY (subquery)
a pozostałe dwa używają
expression operator ANY (array expression)
tak jak opisano w dokumentacji:9.22.4. DOWOLNE/NIEKTÓRE oraz 9.23.3. DOWOLNE/NIEKTÓRE (tablica) .