PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Tablice padów z NULL do maksymalnej długości dla niestandardowej funkcji agregacji

Korzystanie z niestandardowej funkcji agregującej array_agg_mult() jak zdefiniowano w tej powiązanej odpowiedzi:

Twój oczekiwany wynik jest niemożliwy:

{{1},NULL,{abc}}

Musiałoby być:

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

Prosty przypadek z 0 lub 1 elementami tablicy

W prostym przypadku wystarczy zastąpić pustą tablicę:Możesz to osiągnąć za pomocą:

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

Dynamiczne dopełnienie dla n elementów

Używanie array_fill() aby wypełnić tablice elementami NULL do maksymalnej długości:

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;

Nadal działa tylko w przypadku jednowymiarowego podstawowe tablice.

Wyjaśnij

  • Podzapytanie t1 oblicza maksymalną długość podstawowej tablicy jednowymiarowej.
  • COALESCE(array_length(arr, 1), 0) oblicza długość tablicy w tym wierszu.
    COALESCE domyślnie 0 dla NULL .
  • Wygeneruj tablicę dopełniania dla różnicy długości za pomocą array_fill() .
  • Dołącz to do arr z ||
  • Agregacja jak powyżej za pomocą array_agg_mult() .

SQL Fiddle. demonstrowanie wszystkich .
Wyjście w SQL Fiddle jest mylące, więc rzucam wynik na tekst.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. instrukcja select w funkcji postgres wywołana wewnątrz wyzwalacza

  2. Scal wyniki tabeli w kolumny (przestawna/przestawna?)

  3. Zrezygnuj z roli z uprawnieniami

  4. Najlepszy sposób na poznanie procedur składowanych PostgreSQL?

  5. Jak dodać kolumnę, jeśli nie istnieje w PostgreSQL?