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

Arrays de preenchimento com NULL para comprimento máximo para função de agregação personalizada


Usando a função de agregação personalizada array_agg_mult() como definido nesta resposta relacionada:

Seu resultado esperado é impossível:
{{1},NULL,{abc}}

Teria de ser:
{{1},{NULL},{abc}}

Caso simples com 0 ou 1 elementos de matriz


Para o caso simples, basta substituir o array vazio:Você pode conseguir isso com:
WITH t(arr) AS (
    VALUES
      ('{1}'::text[])
     ,('{}')
     ,('{abc}')
   )
SELECT array_agg_mult(ARRAY[CASE WHEN arr = '{}' THEN '{NULL}' ELSE arr END])
FROM   t;

Preenchimento dinâmico para n elementos


Usando array_fill() para preencher arrays com elementos NULL até o comprimento máximo:
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;

Ainda funciona apenas para unidimensional matrizes básicas.

Explicar

  • Subconsulta t1 calcula o comprimento máximo da matriz unidimensional básica.
  • COALESCE(array_length(arr, 1), 0) calcula o comprimento da matriz nesta linha.
    COALESCE o padrão é 0 para NULL .
  • Gere uma matriz de preenchimento para a diferença de comprimento com array_fill() .
  • Anexar isso a arr com ||
  • Agregue como acima com array_agg_mult() .

SQL Fiddle. demonstrando todos .
A saída no SQL Fiddle é enganosa, então eu converto o resultado para o texto lá.