PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Array pad dengan NULL hingga panjang maksimum untuk fungsi agregat khusus

Menggunakan fungsi agregat khusus array_agg_mult() seperti yang didefinisikan dalam jawaban terkait ini:

Hasil yang Anda harapkan tidak mungkin:

{{1},NULL,{abc}}

Seharusnya:

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

Kasus sederhana dengan 0 atau 1 elemen larik

Untuk kasus sederhana hanya mengganti array kosong:Anda dapat mencapainya dengan:

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

Padding dinamis untuk n elemen

Menggunakan array_fill() untuk mengisi array dengan elemen NULL hingga panjang maksimum:

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;

Masih hanya berfungsi untuk 1-dimensi array dasar.

Jelaskan

  • Subkueri t1 menghitung panjang maksimum larik 1 dimensi dasar.
  • COALESCE(array_length(arr, 1), 0) menghitung panjang larik di baris ini.
    COALESCE default ke 0 untuk NULL .
  • Buat larik pengisi untuk perbedaan panjang dengan array_fill() .
  • Tambahkan itu ke arr dengan ||
  • Agregat seperti di atas dengan array_agg_mult() .

SQL Fiddle. mendemonstrasikan semua .
Output dalam SQL Fiddle menyesatkan, jadi saya memberikan hasil ke teks di sana.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Format tanggal UTC Postgres &pemeran zaman, tanda inversi

  2. tidak dapat mengekstrak elemen dari skalar

  3. Jarak antara 2 POIN dalam Postgis di srid 4326 dalam meter

  4. Fungsi SQL dengan parameter yang mungkin NULL

  5. Cara mengembalikan id pada Sisipan dengan Ibatis ( dengan kata kunci RETURNING )