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

Pad-arrays med NULL til maksimal længde for tilpasset aggregatfunktion

Brug af den tilpassede aggregerede funktion array_agg_mult() som defineret i dette relaterede svar:

Dit forventede resultat er umuligt:

{{1},NULL,{abc}}

Skulle være:

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

Simpel case med 0 eller 1 array-elementer

For det simple tilfælde at erstatte det tomme array:Du kan opnå det med:

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

Dynamisk polstring til n elementer

Brug af array_fill() at udfylde arrays med NULL-elementer op til den maksimale længde:

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;

Virker stadig kun til 1-dimensional grundlæggende arrays.

Forklar

  • Underforespørgsel t1 beregner den maksimale længde af det grundlæggende 1-dimensionelle array.
  • COALESCE(array_length(arr, 1), 0) beregner længden af ​​arrayet i denne række.
    COALESCE standard til 0 for NULL .
  • Generer padding-array for forskellen i længde med array_fill() .
  • Føj det til arr med ||
  • Aggregér som ovenfor med array_agg_mult() .

SQL Fiddle. demonstrerer alle .
Output i SQL Fiddle er vildledende, så jeg caster resultatet til tekst der.




  1. Postgres indsætte eller opdatere trigger WHEN tilstand (gammel)

  2. SQL Server 2016 på Linux

  3. Nysgerrig problem med Oracle UNION og ORDER BY

  4. Er en VARCHAR(20000) gyldig i MySQL?