PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come aggregare numeri interi in postgresql?

Espressione select array_agg(4) restituisce set di righe (in realtà set di righe con 1 riga). Da qui la domanda

select *
from b
where b.id = any (select array_agg(4))  -- ERROR

tenta di confrontare un intero (b.id) con un valore di una riga (che ha 1 colonna di tipo integer[]). Genera un errore.

Per risolverlo dovresti usare una sottoquery che restituisce interi (non array di interi):

select *
from b
where b.id = any (select unnest(array_agg(4)))

In alternativa, puoi inserire il nome della colonna del risultato di select array_agg(4) come argomento di any , ad esempio:

select *
from b
cross join (select array_agg(4)) agg(arr)
where b.id = any (arr)

o

with agg as (
    select array_agg(4) as arr)
select *
    from b
    cross join agg
    where b.id = any (arr)

Più formalmente, le prime due query utilizzano ANY del modulo:

expression operator ANY (subquery)

e gli altri due usano

expression operator ANY (array expression)

come descritto nella documentazione:9.22.4. QUALSIASI/ALCUNE e 9.23.3. QUALSIASI/ALCUNI (array) .