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

Rellene las matrices con NULL a la longitud máxima para la función agregada personalizada

Usando la función agregada personalizada array_agg_mult() como se define en esta respuesta relacionada:

Tu resultado esperado es imposible:

{{1},NULL,{abc}}

Tendría que ser:

{{1},{NULL},{abc}}

Caso simple con 0 o 1 elementos de matriz

Para el caso simple de simplemente reemplazar la matriz vacía:puede lograrlo con:

WITH t(arr) AS (
    VALUES
      ('{1}'::text[])
     ,('{}')
     ,('{abc}')
   )
SELECT array_agg_mult(ARRAY[CASE WHEN arr = '{}' THEN '{NULL}' ELSE arr END])
FROM   t;

Relleno dinámico para n elementos

Usando array_fill() para rellenar arreglos con elementos NULL hasta la longitud máxima:

SELECT array_agg_mult(ARRAY[
         arr || array_fill(NULL::text
                         , ARRAY[max_elem - COALESCE(array_length(arr, 1), 0)])
       ]) AS result
FROM   t, (SELECT max(array_length(arr, 1)) AS max_elem FROM t) t1;

Todavía solo funciona para unidimensional matrices básicas.

Explicar

  • Subconsulta t1 calcula la longitud máxima de la matriz unidimensional básica.
  • COALESCE(array_length(arr, 1), 0) calcula la longitud de la matriz en esta fila.
    COALESCE por defecto es 0 para NULL .
  • Genera una matriz de relleno para la diferencia de longitud con array_fill() .
  • Agregar eso a arr con ||
  • Agregue como arriba con array_agg_mult() .

SQL Fiddle. demostrando todas .
La salida en SQL Fiddle es engañosa, por lo que transfiero el resultado al texto allí.