Saya mencari cara untuk menggabungkan string bidang dalam grup dengan kueri. Jadi misalnya, saya punya tabel:
ID COMPANY_ID EMPLOYEE
1 1 Anna
2 1 Bill
3 2 Carol
4 2 Dave
dan saya ingin mengelompokkan berdasarkan company_id untuk mendapatkan sesuatu seperti:
COMPANY_ID EMPLOYEE
1 Anna, Bill
2 Carol, Dave
Ada fungsi bawaan di mySQL untuk melakukan group_concat ini
Jawaban:
PostgreSQL 9.0 atau lebih baru:
Versi terbaru Postgres (sejak akhir 2010) memiliki
string_agg(expression, delimiter)
fungsi yang akan melakukan persis apa yang ditanyakan, bahkan memungkinkan Anda menentukan string pembatas:Postgres 9.0 juga menambahkan kemampuan untuk menentukan
ORDER BY
klausa dalam ekspresi agregat apa pun ; jika tidak, pesanan tidak ditentukan. Jadi sekarang Anda dapat menulis:Atau memang:
PostgreSQL 8.4 atau lebih baru:
PostgreSQL 8.4 (pada 2009) memperkenalkan fungsi agregat
array_agg(expression)
yang menggabungkan nilai-nilai ke dalam array. Kemudianarray_to_string()
dapat digunakan untuk memberikan hasil yang diinginkan:string_agg
untuk versi pra-8.4:Jika ada orang yang menemukan ini mencari shim yang kompatibel untuk pra-9.0 database, adalah mungkin untuk mengimplementasikan semuanya
string_agg
kecualiORDER BY
klausa.Jadi dengan definisi di bawah ini harus berfungsi sama seperti pada 9.x Postgres DB:
Tetapi ini akan menjadi kesalahan sintaksis:
Diuji pada PostgreSQL 8.3.
Variasi khusus (semua versi Postgres)
Sebelum 9.0, tidak ada fungsi agregat bawaan untuk merangkai string. Implementasi kustom yang paling sederhana ( disarankan oleh Vajda Gabo dalam posting milis ini , di antara banyak lainnya) adalah dengan menggunakan
textcat
fungsi bawaan (yang ada di belakang||
operator):Ini
CREATE AGGREGATE
dokumentasinya.Ini hanya menempelkan semua string bersama, tanpa pemisah. Untuk mendapatkan "," yang disisipkan di antara mereka tanpa di bagian akhir, Anda mungkin ingin membuat fungsi penggabungan Anda sendiri dan menggantinya dengan "textcat" di atas. Inilah yang saya kumpulkan dan uji pada 8.3.12:
Versi ini akan menampilkan koma bahkan jika nilai di baris adalah nol atau kosong, sehingga Anda mendapatkan output seperti ini:
Jika Anda lebih suka menghapus koma ekstra untuk menghasilkan ini:
Kemudian tambahkan tanda
ELSIF
centang ke fungsi seperti ini:sumber
array_to_string(array_agg(employee), ',')
?Order By
klausa di dalam fungsi agregat, misalnyastring_agg(employee, ',' Order By employee)
Bagaimana dengan menggunakan fungsi-fungsi array bawaan Postgres? Setidaknya pada 8,4 ini berhasil di luar kotak:
sumber
Sejak PostgreSQL 9.0 Anda dapat menggunakan fungsi agregat yang disebut string_agg . SQL baru Anda akan terlihat seperti ini:
sumber
Saya tidak mengklaim pujian untuk jawabannya karena saya menemukannya setelah beberapa pencarian:
Apa yang saya tidak tahu adalah bahwa PostgreSQL memungkinkan Anda untuk mendefinisikan fungsi agregat Anda sendiri dengan CREATE AGGREGATE
Posting ini pada daftar PostgreSQL menunjukkan betapa sepele membuat fungsi untuk melakukan apa yang diperlukan:
sumber
Seperti yang telah disebutkan, membuat fungsi agregat Anda sendiri adalah hal yang benar untuk dilakukan. Berikut ini adalah fungsi agregat gabungan saya (Anda dapat menemukan detail dalam bahasa Prancis ):
);
Dan kemudian menggunakannya sebagai:
sumber
Cuplikan daftar pengumuman terbaru ini mungkin menarik jika Anda akan meningkatkan ke 8.4:
Saya akan menautkan ke dokumen pengembangan 8,4 tetapi mereka tampaknya belum mencantumkan fitur ini.
sumber
Menindaklanjuti jawaban Kev, menggunakan dokumen Postgres:
Pertama, buat array elemen, lalu gunakan
array_to_string
fungsi bawaan.sumber
Mengikuti lagi tentang penggunaan fungsi agregat khusus dari rangkaian string: Anda harus ingat bahwa pernyataan pilih akan menempatkan baris dalam urutan apa pun, jadi Anda perlu melakukan sub pilih dalam pernyataan dari dengan perintah dengan klausa, dan kemudian pilih luar dengan grup dengan klausa untuk mengagregasi string, dengan demikian:
sumber
Saya menemukan dokumentasi PostgreSQL ini bermanfaat: http://www.postgresql.org/docs/8.0/interactive/functions-conditional.html .
Dalam kasus saya, saya mencari SQL biasa untuk menggabungkan bidang dengan tanda kurung di sekitarnya, jika bidang tersebut tidak kosong.
sumber
Gunakan
STRING_AGG
fungsi untuk PostgreSQL dan Google BigQuery SQL :sumber
Menurut versi PostgreSQL 9.0 dan di atasnya, Anda dapat menggunakan fungsi agregat yang disebut string_agg. SQL baru Anda akan terlihat seperti ini:
sumber
Anda juga dapat menggunakan fungsi format. Yang juga dapat secara implisit menangani konversi jenis teks, int, dll dengan sendirinya.
sumber
Saya menggunakan Jetbrains Rider dan itu merepotkan menyalin hasil dari contoh di atas untuk mengeksekusi kembali karena sepertinya membungkus semuanya dalam JSON. Ini menggabungkan mereka ke dalam satu pernyataan yang lebih mudah dijalankan
sumber
Jika Anda menggunakan Amazon Redshift, di mana string_agg tidak didukung, coba gunakan listagg.
sumber