sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man använder array_agg() för varchar[]

Den standardaggregerade funktionen array_agg() fungerar bara för bastyper, inte matristyper som indata.(Men Postgres 9.5+ har en ny variant av array_agg() det kan!)

Du kan använda den anpassade aggregatfunktionen array_agg_mult() enligt definitionen i detta relaterade svar:
Välja data i en Postgres-array

Skapa den en gång per databas. Då kan din fråga fungera så här:

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;

Det finns en detaljerad motivering i det länkade svaret.

Omfattningar måste matcha

Som svar på din kommentar, överväg detta citat från manualen om arraytyper:

Flerdimensionella arrayer måste ha matchande omfattning för varje dimension. En missmatchning orsakar ett fel.

Det finns ingen väg runt det, array-typen tillåter inte en sådan missmatchning i Postgres. Du kunde fyll dina arrayer med NULL-värden så att alla dimensioner har matchande omfattning.

Men jag skulle hellre översätta arrayerna till kommaseparerade listor med array_to_string() för denna fråga och använd string_agg() för att samla text - helst med en annan separator. Använder en nyrad i mitt exempel:

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

Normalisera

Du kanske vill överväga att normalisera ditt schema till att börja med. Vanligtvis skulle du implementera en sådan n:m-relation med en separat tabell som beskrivs i det här exemplet:
Hur implementerar man en många-till-många-relation i PostgreSQL?




  1. SQL Group By med en Order By

  2. MySQL beviljar privilegier till användare för databas

  3. ORACLE Efter uppdateringstrigger:löser ORA-04091 mutationstabellfel

  4. Hur man kontrollerar PostgreSQL-versionen