Ausdruck select array_agg(4)
gibt eine Reihe von Zeilen zurück (eigentlich eine Reihe von Zeilen mit 1 Zeile). Daher die Abfrage
select *
from b
where b.id = any (select array_agg(4)) -- ERROR
versucht, eine ganze Zahl (b.id) mit einem Wert einer Zeile zu vergleichen (die 1 Spalte vom Typ integer[] hat). Es löst einen Fehler aus.
Um dies zu beheben, sollten Sie eine Unterabfrage verwenden, die Ganzzahlen (keine Arrays von Ganzzahlen) zurückgibt:
select *
from b
where b.id = any (select unnest(array_agg(4)))
Alternativ können Sie den Spaltennamen des Ergebnisses von select array_agg(4)
platzieren als Argument von any
, z. B.:
select *
from b
cross join (select array_agg(4)) agg(arr)
where b.id = any (arr)
oder
with agg as (
select array_agg(4) as arr)
select *
from b
cross join agg
where b.id = any (arr)
Formaler verwenden die ersten beiden Abfragen ANY
der Form:
expression operator ANY (subquery)
und die anderen beiden verwenden
expression operator ANY (array expression)
wie es in der Dokumentation beschrieben ist:9.22.4. ALLE/EINIGE und 9.23.3. ALLE/EINIGE (Array) .