PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie aggregiert man ganze Zahlen in Postgresql?

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) .