sql >> Databasteknik >  >> RDS >> PostgreSQL

Pad-arrayer med NULL till maximal längd för anpassad aggregatfunktion

Använder den anpassade aggregatfunktionen array_agg_mult() som definieras i detta relaterade svar:

Ditt förväntade resultat är omöjligt:

{{1},NULL,{abc}}

Skulle behöva vara:

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

Enkelt fall med 0 eller 1 arrayelement

För det enkla fallet att bara ersätta den tomma arrayen:Du kan uppnå 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 stoppning för n element

Använder array_fill() att fylla ut arrayer med NULL-element upp till maximal längd:

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;

Fungerar fortfarande bara för 1-dimensionell grundläggande arrayer.

Förklara

  • Underfråga t1 beräknar den maximala längden för den grundläggande 1-dimensionella matrisen.
  • COALESCE(array_length(arr, 1), 0) beräknar längden på arrayen i den här raden.
    COALESCE standard till 0 för NULL .
  • Generera utfyllnadsmatris för skillnaden i längd med array_fill() .
  • Lägg till det i arr med ||
  • Aggregera som ovan med array_agg_mult() .

SQL-fiol. demonstrerar alla .
Utdata i SQL Fiddle är missvisande, så jag castar resultat till text där.




  1. Hur man säger skapa procedur om den inte finns i MySQL

  2. Varför fungerar inte sqlalchemys standardkolumnvärde

  3. Dataaggregation mongodb vs mysql

  4. Postgresql infoga trigger för att ställa in värde