PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Füllen Sie Arrays mit NULL bis zur maximalen Länge für benutzerdefinierte Aggregatfunktionen auf

Verwenden der benutzerdefinierten Aggregatfunktion array_agg_mult() wie in dieser verwandten Antwort definiert:

Ihr erwartetes Ergebnis ist unmöglich:

{{1},NULL,{abc}}

Müsste lauten:

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

Einfacher Fall mit 0 oder 1 Array-Element

Für den einfachen Fall, nur das leere Array zu ersetzen:Das erreichen Sie mit:

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

Dynamisches Padding für n Elemente

Verwenden von array_fill() um Arrays mit NULL-Elementen bis zur maximalen Länge aufzufüllen:

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;

Funktioniert immer noch nur für 1-dimensional grundlegende Arrays.

Erklären

  • Unterabfrage t1 berechnet die maximale Länge des grundlegenden eindimensionalen Arrays.
  • COALESCE(array_length(arr, 1), 0) berechnet die Länge des Arrays in dieser Zeile.
    COALESCE ist standardmäßig 0 für NULL .
  • Auffüllarray für den Längenunterschied mit array_fill() erzeugen .
  • Hänge das an arr an mit ||
  • Aggregieren Sie wie oben mit array_agg_mult() .

SQL-Fiddle. demonstrieren alle .
Die Ausgabe in SQL Fiddle ist irreführend, daher habe ich das Ergebnis dort in Text umgewandelt.