sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo usar array_agg() para varchar[]

La función agregada estándar array_agg() solo funciona para tipos base, no para tipos de matriz como entrada. (Pero Postgres 9.5+ tiene una nueva variante de array_agg() eso puede!)

Podría usar la función agregada personalizada array_agg_mult() como se define en esta respuesta relacionada:
Seleccionar datos en una matriz de Postgres

Créelo una vez por base de datos. Entonces su consulta podría funcionar así:

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;

Hay una justificación detallada en la respuesta vinculada.

Las extensiones deben coincidir

En respuesta a su comentario, considere esta cita del manual sobre tipos de matrices:

Las matrices multidimensionales deben tener extensiones coincidentes para cada dimensión. Una falta de coincidencia provoca un error.

No hay forma de evitarlo, el tipo de matriz no permite tal desajuste en Postgres. podrías rellene sus arreglos con valores NULOS para que todas las dimensiones tengan extensiones coincidentes.

Pero preferiría traducir las matrices a listas separadas por comas con array_to_string() para el propósito de esta consulta y use string_agg() para agregar el text - preferiblemente con un separador diferente. Usando una nueva línea en mi ejemplo:

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

Es posible que desee considerar la normalización de su esquema para empezar. Por lo general, implementaría una relación n:m de este tipo con una tabla separada como se describe en este ejemplo:
¿Cómo implementar una relación de muchos a muchos en PostgreSQL?