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

Array awal berfungsi untuk menggabungkan array multi-dimensi

Postgres 9.5 atau yang lebih baru

... dikirimkan dengan varian tambahan dari fungsi agregat array_agg() . Panduan:

array input digabungkan menjadi array satu dimensi yang lebih tinggi (semua input harus memiliki dimensi yang sama, dan tidak boleh kosong atau nol)

Jadi tidak persis sama dengan fungsi agregat khusus array_agg_mult() di bawah. Tapi gunakanlah, jika Anda bisa. Lebih cepat.

Terkait:

  • Bagaimana cara mengurutkan array int dua dimensi di PostgreSQL?

Postgres 9.4 atau lebih lama

Fungsi agregat untuk apa saja jenis larik

Dengan tipe polimorfik anyarray ini berfungsi untuk semua jenis array (termasuk integer[] ):

CREATE AGGREGATE array_agg_mult (anyarray) (
   SFUNC     = array_cat
 , STYPE     = anyarray
 , INITCOND  = '{}'
);

Seperti yang disediakan @Lukas, fungsi kustom arrayappend() tidak diperlukan. array_cat() . bawaan melakukan pekerjaan. Namun, itu tidak menjelaskan mengapa contoh Anda gagal, sedangkan yang ada di jawaban Lukas berfungsi. Perbedaan yang relevan adalah bahwa Lukas menyarangkan array ke lapisan array lain dengan array[d.a] .

Anda tersandung asumsi yang salah bahwa Anda dapat mendeklarasikan tipe int[][] . Tapi Anda tidak bisa:int[][] adalah jenis yang sama sebagai int[] untuk sistem tipe PostgreSQL. Bab tentang tipe array dalam manual menjelaskan:

Implementasi saat ini juga tidak menerapkan jumlah dimensi yang dinyatakan. Array dari tipe elemen tertentu semuanya dianggap dari tipe yang sama, terlepas dari ukuran atau jumlah dimensi. Jadi, mendeklarasikan ukuran array atau jumlah dimensi diCREATE TABLE hanyalah dokumentasi; itu tidak mempengaruhi perilaku run-time.

Sebuah n array integer -dimensi secara efektif adalah array n-1 array -dimensi integer di PostgreSQL. Anda tidak dapat membedakannya dari tipe yang hanya mendefinisikan elemen dasar . Anda harus bertanya array_dims() untuk mendapatkan spesifikasinya.

Untuk mendemonstrasikan:

SELECT array_agg_mult(arr1)               AS arr1  --> 1-dim array
     , array_agg_mult(ARRAY[arr1])        AS arr2  --> 2-dim array
     , array_agg_mult(ARRAY[ARRAY[arr1]]) AS arr3  --> 3-dim array
       -- etc.
FROM  (
   VALUES
      ('{1,2,3}'::int[])                           -- 1-dim array
    , ('{4,5,6}')
    , ('{7,8,9}')
   ) t(arr1);

Atau:

SELECT array_agg_mult(arr2)        AS arr2  --> 2-dim array
     , array_agg_mult(ARRAY[arr2]) AS arr3  --> 3-dim array
     , array_agg(arr2)             AS arr3  --> 3-dim array; superior in Postgres 9.5+
FROM  (
   VALUES
      ('{{1,2,3}}'::int[])                  -- 2-dim array
     ,('{{4,5,6}}')
     ,('{{7,8,9}}')
   ) t(arr2);

Semua kolom yang dihasilkan memiliki tipe yang sama :int[] (walaupun mengandung jumlah dimensi yang berbeda).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. pemilik database postgresql tidak dapat mengakses database - Tidak ada hubungan yang ditemukan.

  2. Mengaktifkan dukungan PostgreSQL di PHP di Mac OS X

  3. Bagaimana cara pg_dump database RDS Postgres?

  4. Pilih stempel waktu hari ini saja (sejak tengah malam)

  5. Hitung jumlah acara bersamaan dalam SQL