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

Bisakah kita mendefinisikan fungsi GROUP_CONCAT di PostgreSQL?

Ada string_agg() bawaan yang melakukan apa yang Anda inginkan, tetapi Anda secara khusus memintanya diberi nama group_concat untuk kompatibilitas MySQL. Sayangnya, string_agg() menggunakan tipe data internal untuk akumulasi (mungkin untuk menghindari penyalinan seluruh buffer pada setiap append, saya belum melihat sumbernya) dan saya tidak menemukan cara untuk mendeklarasikan aggrerate SQL yang identik dengan string_agg( ).

Mendefinisikan fungsi group_concat() juga tidak akan berfungsi, karena pg harus disadarkan bahwa itu adalah agregat, bukan fungsi dengan agregat tersembunyi di dalamnya, yang tidak akan berfungsi. Fungsi seperti itu akan beroperasi pada satu baris pada satu waktu:agregat apa pun di dalamnya hanya akan menggabungkan satu baris dan mengembalikannya tidak berubah...

Dengan demikian, kode ini akan mengakumulasikan elemen ke dalam array, kemudian menambahkan pembatas "," dengan array_to_string. Saya akan menggunakan deklarasi array_agg() (sebelum menjadi built-in) sebagai model, dan cukup menambahkan fungsi finalizer yang akan mengubah array agregat menjadi teks.

CREATE OR REPLACE FUNCTION _group_concat_finalize(anyarray)
RETURNS text AS $$
    SELECT array_to_string($1,',')
$$ IMMUTABLE LANGUAGE SQL;

CREATE AGGREGATE group_concat(anyelement) (
   SFUNC=array_append,
   STYPE=anyarray,
   FFUNC=_group_concat_finalize,
   INITCOND='{}'
);

SELECT group_concat(x) FROM foo;

Hal yang menyenangkan adalah itu harus bekerja dengan baik untuk semua jenis, tanpa kerumitan, berkat jenis generik "anyarray" dan "anyelement".

Saya akan menganggap ini akan lebih lambat dari string_agg() jika string_agg memang menghindari untuk menyalin seluruh array agregasi pada setiap append. Ini akan menjadi masalah hanya jika jumlah baris yang akan dikelompokkan ke dalam setiap set besar. Dalam hal ini, Anda mungkin dapat meluangkan waktu sebentar untuk mengedit kueri SQL;)

http://sqlfiddle.com/#!17/c452d/1



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Urutkan nilai NULL ke akhir tabel

  2. Perbedaan tanggal PostgreSQL

  3. Masukkan ke dalam tabel setelah mendapatkan ID dari tabel lain

  4. Isolasi Transaksi di PostgreSQL

  5. Kondisi SQL pada fungsi Window