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

Hapus beberapa array secara paralel

Anda akan mencintai fitur baru Postgres 9.4 :

unnest(anyarray, anyarray [, ...])

unnest() dengan kemampuan yang sangat diantisipasi (setidaknya menurut saya) untuk menghapus beberapa array secara paralel dengan bersih . Panduan:

memperluas beberapa array (mungkin dari jenis yang berbeda) ke satu set baris. Ini hanya diperbolehkan dalam klausa FROM;

Ini adalah implementasi khusus dari ROWS FROM baru fitur.

Fungsi Anda sekarang bisa menjadi:

CREATE OR REPLACE FUNCTION multi_unnest(_some_id int
                                      , _amounts numeric[]
                                      , _invoices text[])
  RETURNS TABLE (some_id int, amount numeric, invoice text) AS
$func$
SELECT _some_id, u.* FROM unnest(_amounts, _invoices) u;
$func$ LANGUAGE sql;

Telepon:

SELECT * FROM multi_unnest(123, '{100, 40.5, 76}'::numeric[] 
                        , '{01-2222-05,01-3333-04,01-4444-08}'::text[]);

Tentu saja, bentuk sederhana dapat diganti dengan SQL biasa (tidak ada fungsi tambahan):

SELECT 123 AS some_id, *
FROM unnest('{100, 40.5, 76}'::numeric[]
          , '{01-2222-05,01-3333-04,01-4444-08}'::text[]) AS u(amount, invoice);

Di versi sebelumnya (Postgres 9.3- ), Anda dapat menggunakan formulir yang kurang elegan dan kurang aman:

SELECT 123 AS some_id
     , unnest('{100, 40.5, 76}'::numeric[]) AS amount
     , unnest('{01-2222-05,01-3333-04,01-4444-08}'::text[]) AS invoice;

Peringatan dari bentuk singkatan lama:selain tidak standar untuk memiliki fungsi set-return di SELECT list, jumlah baris yang dikembalikan akan menjadi kelipatan umum terendah dari setiap jumlah elemen array (dengan hasil yang mengejutkan untuk angka yang tidak sama). Detail dalam jawaban terkait ini:

  • Paralel unnest() dan urutkan urutan di PostgreSQL
  • Apakah ada sesuatu seperti fungsi zip() di PostgreSQL yang menggabungkan dua array?

Perilaku ini akhirnya telah dibersihkan dengan Postgres 10 . Beberapa fungsi pengembalian set di SELECT list menghasilkan baris dalam "langkah kunci" sekarang. Lihat:

  • Apa perilaku yang diharapkan untuk beberapa fungsi pengembalian-set dalam klausa SELECT?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengembangkan PostgreSQL untuk Windows, Bagian 3

  2. Menggunakan Replikasi Logis PostgreSQL untuk Mempertahankan Server TEST Baca/Tulis yang Selalu Terkini

  3. psql - simpan hasil perintah ke file

  4. Postgres:perintah vakum tidak membersihkan tupel yang mati

  5. Postgres pg_dump membuang basis data dalam urutan yang berbeda setiap saat