PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak używać array_agg() dla varchar[]

Standardowa funkcja agregująca array_agg() działa tylko dla typów bazowych, a nie typów tablicowych jako danych wejściowych.(Ale Postgres 9.5+ ma nowy wariant array_agg() to może!)

Możesz użyć niestandardowej funkcji agregującej array_agg_mult() zgodnie z definicją w tej powiązanej odpowiedzi:
Wybieranie danych do tablicy Postgres

Utwórz go raz na bazę danych. Wtedy Twoje zapytanie może działać tak:

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;

W odpowiedzi, do której prowadzi link, znajduje się szczegółowe uzasadnienie.

Rozmiary muszą się zgadzać

W odpowiedzi na Twój komentarz, rozważ ten cytat z podręcznika na temat typów tablic:

Tablice wielowymiarowe muszą mieć pasujące zakresy dla każdego wymiaru. Niezgodność powoduje błąd.

Nie da się tego obejść, typ tablicy nie pozwala na taką niezgodność w Postgresie. możesz uzupełnij swoje tablice wartościami NULL, aby wszystkie wymiary miały pasujące zakresy.

Ale wolałbym przetłumaczyć tablice na listy oddzielone przecinkami za pomocą array_to_string() na potrzeby tego zapytania i użyj string_agg() aby zagregować text - najlepiej z innym separatorem. Używając nowej linii w moim przykładzie:

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

Normalizuj

Na początek warto rozważyć normalizację schematu. Zazwyczaj taką relację n:m można zaimplementować z osobną tabelą, jak pokazano w tym przykładzie:
Jak zaimplementować relację wiele-do-wielu w PostgreSQL?




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Adnotacja hibernacji dla typu szeregowego PostgreSQL

  2. Aktualizacje narzędzi testowych PostgreSQL z archiwum testów

  3. Aktualizacje oparte na niestandardowych wyzwalaczach dla PostgreSQL

  4. Mapowanie typu tekstu PostgreSQL[][] i typu Java

  5. brak wpisu pg_hba.conf dla hosta