sql >> Database >  >> RDS >> PostgreSQL

Hoe gehele getallen te aggregeren in postgresql?

Uitdrukking select array_agg(4) retourneert een reeks rijen (eigenlijk een reeks rijen met 1 rij). Vandaar de vraag

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

probeert een geheel getal (b.id) te vergelijken met een waarde van een rij (die 1 kolom van het type integer[] heeft). Het geeft een foutmelding.

Om dit op te lossen moet je een subquery gebruiken die gehele getallen retourneert (geen arrays van gehele getallen):

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

Als alternatief kunt u de kolomnaam van het resultaat van select array_agg(4) . plaatsen als een argument van any , bijv.:

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

of

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

Meer formeel gebruiken de eerste twee zoekopdrachten ANY van het formulier:

expression operator ANY (subquery)

en de andere twee gebruiken

expression operator ANY (array expression)

zoals het wordt beschreven in de documentatie:9.22.4. ENIGE/SOMMIGE en 9.23.3. ELKE/SOMMIGE (matrix) .



  1. Hoe de datum en tijd van verschillende MySQL-kolommen te combineren om te vergelijken met een volledige DateTime?

  2. Probleem met winkelaccessor:kan geen oude, reeds opgeslagen json-object geserialiseerde (hash) waarden in mysql-database in Rails 4 lezen

  3. Database-ontwerp 101:partities in MySQL

  4. Postgresql-query tussen datumbereiken