sql >> Databáze >  >> RDS >> PostgreSQL

Jak používat array_agg() pro varchar[]

Standardní agregační funkce array_agg() funguje pouze pro základní typy, nikoli pro typy polí jako vstup. (Ale Postgres 9.5+ má novou variantu array_agg() to může!)

Můžete použít vlastní agregační funkci array_agg_mult() jak je definováno v této související odpovědi:
Výběr dat do pole Postgres

Vytvořte jej jednou pro každou databázi. Pak by váš dotaz mohl fungovat takto:

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;

V propojené odpovědi je podrobné zdůvodnění.

Rozsahy se musí shodovat

V reakci na váš komentář zvažte tento citát z příručky o typech polí:

Vícerozměrná pole musí mít odpovídající rozsahy pro každou dimenzi. Neshoda způsobí chybu.

To nejde nijak obejít, typ pole takovou neshodu v Postgresu neumožňuje. Mohli byste vyplňte pole hodnotami NULL, aby všechny dimenze měly odpovídající rozsahy.

Ale raději bych pole přeložil na seznamy oddělené čárkami pomocí array_to_string() pro účely tohoto dotazu použijte string_agg() agregovat text - nejlépe s jiným separátorem. Použití nového řádku v mém příkladu:

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

Normalizovat

Možná budete chtít nejprve zvážit normalizaci schématu. Obvykle byste takový vztah n:m implementovali se samostatnou tabulkou, jak je uvedeno v tomto příkladu:
Jak implementovat vztah many-to-many v PostgreSQL?




  1. Jak najít a nahradit text v databázi MySQL pomocí SQL

  2. Vypsat všechny sloupce s možnou hodnotou Null v databázi SQL Server

  3. jak na Flashback, když máme dataguard

  4. Jak získat velikost databáze MySQL pro vaši databázi?