PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Pad array con NULL alla lunghezza massima per la funzione di aggregazione personalizzata

Utilizzando la funzione di aggregazione personalizzata array_agg_mult() come definito in questa risposta correlata:

Il risultato atteso è impossibile:

{{1},NULL,{abc}}

Dovrebbe essere:

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

Caso semplice con 0 o 1 elementi dell'array

Per il semplice caso di sostituire semplicemente l'array vuoto:puoi ottenerlo con:

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

Padding dinamico per n elementi

Usando array_fill() per riempire gli array con elementi NULL fino alla lunghezza massima:

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;

Funziona ancora solo per monodimensionale array di base.

Spiega

  • Subquery t1 calcola la lunghezza massima dell'array unidimensionale di base.
  • COALESCE(array_length(arr, 1), 0) calcola la lunghezza dell'array in questa riga.
    COALESCE il valore predefinito è 0 per NULL .
  • Genera un array di riempimento per la differenza di lunghezza con array_fill() .
  • Aggiungilo a arr con ||
  • Aggrega come sopra con array_agg_mult() .

SQL Fiddle. dimostrando tutti .
L'output in SQL Fiddle è fuorviante, quindi ho lanciato il risultato sul testo lì.