sql >> Databáze >  >> RDS >> PostgreSQL

Vyplňte pole s NULL na maximální délku pro vlastní agregační funkci

Použití vlastní agregační funkce array_agg_mult() jak je definováno v této související odpovědi:

Váš očekávaný výsledek je nemožný:

{{1},NULL,{abc}}

Musí to být:

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

Jednoduchý případ s 0 nebo 1 prvky pole

Pro jednoduchý případ stačí nahradit prázdné pole:Toho dosáhnete pomocí:

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

Dynamické odsazení pro n prvků

Pomocí array_fill() k vyplnění polí prvky NULL až do maximální délky:

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;

Stále funguje pouze pro jednorozměrné základní pole.

Vysvětlete

  • Poddotaz t1 vypočítá maximální délku základního 1-rozměrného pole.
  • COALESCE(array_length(arr, 1), 0) vypočítá délku pole v tomto řádku.
    COALESCE výchozí je 0 pro NULL .
  • Vygenerujte pole výplně pro rozdíl v délce pomocí array_fill() .
  • Přidejte to do arr s ||
  • Agregujte jako výše pomocí array_agg_mult() .

SQL Fiddle. předvedení všech .
Výstup v SQL Fiddle je zavádějící, takže jsem tam přenesl výsledek do textu.




  1. eliminace speciálních znaků regulárního výrazu

  2. Chyba syntaxe MySQL při vytváření funkce

  3. Proč nemohu generovat dotaz pomocí vztahů?

  4. Jak získat záznamy z dneška v MySQL