PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment agréger des entiers dans postgresql ?

Expression select array_agg(4) renvoie un ensemble de lignes (en fait un ensemble de lignes avec 1 ligne). D'où la requête

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

essaie de comparer un entier (b.id) à une valeur d'une ligne (qui a 1 colonne de type entier[]). Cela génère une erreur.

Pour résoudre ce problème, vous devez utiliser une sous-requête qui renvoie des entiers (et non des tableaux d'entiers) :

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

Alternativement, vous pouvez placer le nom de la colonne du résultat de select array_agg(4) comme argument de any , par exemple :

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

ou

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

Plus formellement, les deux premières requêtes utilisent ANY de la forme :

expression operator ANY (subquery)

et les deux autres utilisent

expression operator ANY (array expression)

comme décrit dans la documentation :9.22.4. N'IMPORTE QUEL et 9.23.3. TOUT/CERTAINS (tableau) .