PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como usar array_agg() para varchar[]


A função agregada padrão array_agg() funciona apenas para tipos base, não para tipos de matriz como entrada.(Mas Postgres 9.5+ tem uma nova variante de array_agg() que pode!)

Você pode usar a função de agregação personalizada array_agg_mult() conforme definido nesta resposta relacionada:
Selecionando dados em um array Postgres

Crie-o uma vez por banco de dados. Então sua consulta poderia funcionar assim:
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;

Há uma justificativa detalhada na resposta vinculada.

As extensões precisam corresponder


Em resposta ao seu comentário, considere esta citação do manual sobre tipos de array:

As matrizes multidimensionais devem ter extensões correspondentes para cada dimensão. Uma incompatibilidade causa um erro.

Não há como contornar isso, o tipo array não permite essa incompatibilidade no Postgres. Você poderia preencha seus arrays com valores NULL para que todas as dimensões tenham extensões correspondentes.

Mas eu prefiro traduzir os arrays para uma lista separada por vírgulas com array_to_string() para esta consulta e use string_agg() para agregar o text - de preferência com um separador diferente. Usando uma nova linha no meu exemplo:
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   ...

Normalizar


Você pode querer considerar normalizar seu esquema para começar. Normalmente, você implementaria um relacionamento n:m com uma tabela separada, conforme descrito neste exemplo:
Como implementar um relacionamento muitos-para-muitos no PostgreSQL?