sql >> Database >  >> RDS >> PostgreSQL

Hoe array_agg() te gebruiken voor varchar[]

De standaard aggregatiefunctie array_agg() werkt alleen voor basistypen, niet voor arraytypen als invoer. (Maar Postgres 9.5+ heeft een nieuwe variant van array_agg() dat kan!)

U kunt de aangepaste aggregatiefunctie array_agg_mult() . gebruiken zoals gedefinieerd in dit gerelateerde antwoord:
Gegevens selecteren in een Postgres-array

Maak het eenmaal per database aan. Dan zou uw zoekopdracht als volgt kunnen werken:

SELECT use.user_sched_id, array_agg(se.sched_entry_id) AS seids
      ,array_agg_mult(ARRAY[se.min_crew]) AS min_crew_arr
FROM   base.sched_entry se
LEFT   JOIN base.user_sched_entry use USING (sched_entry_id)
WHERE  se.sched_entry_id = ANY(ARRAY[623, 625])
GROUP  BY user_sched_id;

Het gelinkte antwoord bevat een gedetailleerde redenering.

Hoeveelheid moet overeenkomen

Bekijk in reactie op uw opmerking dit citaat uit de handleiding over arraytypes:

Multidimensionale arrays moeten overeenkomende begrenzingen hebben voor elke dimensie. Een mismatch veroorzaakt een fout.

Er is geen manier om dat te omzeilen, het arraytype staat een dergelijke mismatch in Postgres niet toe. Je zou vul uw arrays met NULL-waarden zodat alle dimensies overeenkomende begrenzingen hebben.

Maar ik zou de arrays liever vertalen naar een door komma's gescheiden lijst met array_to_string() voor deze zoekopdracht en gebruik string_agg() om de text te aggregeren - bij voorkeur met een andere separator. Een nieuwe regel gebruiken in mijn voorbeeld:

SELECT use.user_sched_id, array_agg(se.sched_entry_id) AS seids
      ,string_agg(array_to_string(se.min_crew, ','), E'\n') AS min_crews
FROM   ...

Normaliseren

U kunt overwegen om uw schema te normaliseren om mee te beginnen. Normaal gesproken implementeert u zo'n n:m-relatie met een aparte tabel zoals beschreven in dit voorbeeld:
Hoe implementeert u een veel-op-veel-relatie in PostgreSQL?




  1. PostgreSQL-lijstweergaven

  2. JDBC geeft lege resultaatset terug

  3. Waarom retourneert password_verify false?

  4. Python- en SQLite-waarschuwingen