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

Apakah ada sesuatu seperti fungsi Zip() di PostgreSQL yang menggabungkan dua array?

Postgres 9.5 atau lebih baru

memiliki array_agg(array expression) :

array_agg ( anyarray ) → anyarray

Menggabungkan semua array input ke dalam array satu dimensi yang lebih tinggi. (Semua input harus memiliki dimensi yang sama, dan tidak boleh kosong atau nol.)

Ini adalah pengganti drop-in untuk fungsi agregat kustom saya array_agg_mult() ditunjukkan di bawah ini. Ini diimplementasikan dalam C dan jauh lebih cepat. Gunakan.

Postgres 9.4

Gunakan ROWS FROM konstruksi atau unnest() . yang diperbarui yang membutuhkan banyak array untuk di-unnest secara paralel. Masing-masing dapat memiliki panjang yang berbeda. Anda mendapatkan (per dokumentasi):

[...] jumlah baris hasil dalam kasus ini adalah hasil fungsi terbesar, dengan hasil yang lebih kecil diisi dengan nilai nol untuk dicocokkan.

Gunakan varian yang lebih bersih dan sederhana ini:

SELECT ARRAY[a,b] AS ab
FROM   unnest('{a,b,c}'::text[] 
            , '{d,e,f}'::text[]) x(a,b);

Postgres 9.3 atau lebih lama

Zip sederhana()

Pertimbangkan demo berikut untuk Postgres 9.3 atau sebelumnya :

SELECT ARRAY[a,b] AS ab
FROM  (
   SELECT unnest('{a,b,c}'::text[]) AS a
        , unnest('{d,e,f}'::text[]) AS b
    ) x;

Hasil:

  ab
-------
 {a,d}
 {b,e}
 {c,f}

Perhatikan bahwa kedua larik harus memiliki jumlah elemen yang sama untuk menghapus sarang secara paralel, atau Anda mendapatkan tanda silang sebagai gantinya.

Anda dapat membungkusnya menjadi sebuah fungsi, jika Anda ingin:

CREATE OR REPLACE FUNCTION zip(anyarray, anyarray)
  RETURNS SETOF anyarray LANGUAGE SQL AS
$func$
SELECT ARRAY[a,b] FROM (SELECT unnest($1) AS a, unnest($2) AS b) x;
$func$;

Telepon:

SELECT zip('{a,b,c}'::text[],'{d,e,f}'::text[]);

Hasil yang sama.

zip() ke array multidimensi:

Sekarang, jika Anda ingin menggabungkan kumpulan larik baru itu menjadi satu 2-dimensi array, itu menjadi lebih rumit.

SELECT ARRAY (SELECT ...)

atau:

SELECT array_agg(ARRAY[a,b]) AS ab
FROM  (
   SELECT unnest('{a,b,c}'::text[]) AS a
         ,unnest('{d,e,f}'::text[]) AS b
    ) x

atau:

SELECT array_agg(ARRAY[ARRAY[a,b]]) AS ab
FROM  ...

semua akan menghasilkan pesan kesalahan yang sama (diuji dengan hal 9.1.5):

KESALAHAN:tidak dapat menemukan tipe larik untuk tipe data teks[]

Namun ada jalan keluarnya, seperti yang kami kerjakan di bawah pertanyaan yang terkait erat ini.
Buat fungsi agregat khusus:

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

Dan gunakan seperti ini:

SELECT array_agg_mult(ARRAY[ARRAY[a,b]]) AS ab
FROM  (
   SELECT unnest('{a,b,c}'::text[]) AS a
        , unnest('{d,e,f}'::text[]) AS b
    ) x

Hasil:

{{a,d},{b,e},{c,f}}

Perhatikan ARRAY[] tambahan lapisan! Tanpa itu dan hanya:

SELECT array_agg_mult(ARRAY[a,b]) AS ab
FROM ...

Anda mendapatkan:

{a,d,b,e,c,f}

Yang mungkin berguna untuk tujuan lain.

Gulung fungsi lain:

CREATE OR REPLACE FUNCTION zip2(anyarray, anyarray)
  RETURNS SETOF anyarray LANGUAGE SQL AS
$func$
SELECT array_agg_mult(ARRAY[ARRAY[a,b]])
FROM (SELECT unnest($1) AS a, unnest($2) AS b) x;
$func$;

Telepon:

SELECT zip2('{a,b,c}'::text[],'{d,e,f}'::text[]); -- or any other array type

Hasil:

{{a,d},{b,e},{c,f}}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan pg_dump untuk hanya mendapatkan pernyataan penyisipan dari satu tabel dalam database

  2. Cara Mengubah Kata Sandi Pengguna di PostgreSQL

  3. Penyeimbangan Beban PostgreSQL Menggunakan HAProxy &Keepalive

  4. Postgres adalah database paling keren – Alasan #1:Pengembang menyukainya!

  5. Kolom 'mary' tidak ada