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

Sådan bruger du array_agg() til varchar[]

Standard aggregatfunktionen array_agg() virker kun for basistyper, ikke matrixtyper som input.(Men Postgres 9.5+ har en ny variant af array_agg() det kan!)

Du kan bruge den tilpassede aggregerede funktion array_agg_mult() som defineret i dette relaterede svar:
Valg af data i en Postgres-array

Opret det én gang pr. database. Så kunne din forespørgsel fungere sådan her:

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;

Der er en detaljeret begrundelse i det linkede svar.

Udvidelser skal matche

Som svar på din kommentar kan du overveje dette citat fra manualen om arraytyper:

Flerdimensionelle arrays skal have matchende udstrækninger for hver dimension. En uoverensstemmelse forårsager en fejl.

Det er der ingen vej uden om, array-typen tillader ikke en sådan uoverensstemmelse i Postgres. Du kunne udfyld dine arrays med NULL-værdier, så alle dimensioner har matchende udstrækninger.

Men jeg vil hellere oversætte arrays til en komma-separerede lister med array_to_string() til formålet med denne forespørgsel og brug string_agg() for at samle text - gerne med en anden separator. Bruger en ny linje i mit eksempel:

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

Normaliser

Du vil måske overveje at normalisere dit skema til at begynde med. Typisk vil du implementere en sådan n:m-relation med en separat tabel som beskrevet i dette eksempel:
Hvordan implementerer man en mange-til-mange-relation i PostgreSQL?




  1. sql-server ugyldigt objektnavn - men tabeller er opført i SSMS-tabeller

  2. MySQL:Hvad er en omvendt version af LIKE?

  3. Ret "FEJL 1136 (21S01):Kolonneantal stemmer ikke overens med værdiantallet i række 2", når du bruger VALUES Statement i MySQL

  4. Sådan fungerer INSTR()-funktionen i MySQL