sql >> Database >  >> RDS >> PostgreSQL

Pad-arrays met NULL tot maximale lengte voor aangepaste aggregatiefunctie

De aangepaste aggregatiefunctie gebruiken array_agg_mult() zoals gedefinieerd in dit gerelateerde antwoord:

Uw verwachte resultaat is onmogelijk:

{{1},NULL,{abc}}

Zou moeten zijn:

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

Eenvoudig geval met 0 of 1 array-elementen

Voor het eenvoudige geval om gewoon de lege array te vervangen:U kunt dat bereiken met:

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

Dynamische opvulling voor n elementen

array_fill() gebruiken om arrays met NULL-elementen op te vullen tot de maximale lengte:

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;

Werkt nog steeds alleen voor 1-dimensionaal basisarrays.

Uitleggen

  • Subquery t1 berekent de maximale lengte van de 1-dimensionale basisarray.
  • COALESCE(array_length(arr, 1), 0) berekent de lengte van de array in deze rij.
    COALESCE standaard ingesteld op 0 voor NULL .
  • Genereer opvulmatrix voor het verschil in lengte met array_fill() .
  • Voeg dat toe aan arr met ||
  • Aggregeren zoals hierboven met array_agg_mult() .

SQL Fiddle. alles laten zien .
Uitvoer in SQL Fiddle is misleidend, dus ik cast het resultaat daar naar de tekst.




  1. Uitgestelde voorbereiding kon niet worden voltooid fout bij gebruik van lokale database als gekoppelde server

  2. MySQL-gegevensbestand laden

  3. Tijdelijke foutafhandeling in .net core 2.1 MVC voor MySQL-database

  4. Wat zijn benoemde pijpen?