Tips Menggabungkan String dengan Karakter Tertentu Sebagai Pemisah/Separator di Query MySQL

Bagi teman-teman yang sudah sering mengerjakan aplikasi khususnya Sistem Informasi pasti sudah sangat sering bermain dengan fungsi-fungsi string, seperti halnya fungsi implode() di PHP yang digunakan untuk menggabungkan beberapa substring (dalam bentuk array) menjadi satu menggunakan karakter tertentu sebagai pemisahnya.

Pada beberapa kasus penggabungan string ini tidak bisa dilakukan di level bahasa pemrograman tetapi harus dilakukan atau jauh lebih efisien apabila diperoleh dari masukan hasil query-nya, seperti yang saya temukan pada pekerjaan terakhir saya menggunakan MySQL.

Dan ternyata setelah bertanya ke Om Google, tugas sebagai DBA/Dev sangat dipermudah dengan fungsi-fungsi yang telah disediakan oleh MySQL. Dua fungsi yang bisa digunakan disisi query adalah fungsi group_concat() dan concat_ws().

Tentang cara penggunaan dan letak perbedaan dari kedua fungsi diatas, lebih enak langsung kita coba dalam contoh sederhana;

Ok, pertama-tama kita buat table percobaan bernama ‘perusahaan’ dan kita isi data untuk latihan;

create table perusahaan (id int unsigned not null auto_increment primary key, perusahaan_id int unsigned not null default 0, jenis enum('Terbuka', 'Tertutup') not null, direktur varchar(25) not null default '', wakil_direktur_1 varchar(25) not null default '', wakil_direktur_2 varchar(25) not null default '', wakil_direktur_3 varchar(25) not null default '');

insert into perusahaan (perusahaan_id, jenis, direktur, wakil_direktur_1, wakil_direktur_2, wakil_direktur_3) values (1, 'Tertutup', 'Direktur AAA', 'Wakil 1 AAA', '', ''), (200, 'Terbuka', 'Direktur ZZZ', 'Wakil 1 ZZZ', '', 'Wakil 3 ZZZ'), (3, 'Tertutup', 'Direktur CCC', 'Wakil 1 CCC', 'Wakil 2 CCC', 'Wakil 3 CCC');

select * from perusahaan;
+----+---------------+----------+--------------+------------------+------------------+------------------+
| id | perusahaan_id | jenis    | direktur     | wakil_direktur_1 | wakil_direktur_2 | wakil_direktur_3 |
+----+---------------+----------+--------------+------------------+------------------+------------------+
|  1 |             1 | Tertutup | Direktur AAA | Wakil 1 AAA      |                  |                  |
|  2 |           200 | Terbuka  | Direktur ZZZ | Wakil 1 ZZZ      |                  | Wakil 3 ZZZ      |
|  3 |             3 | Tertutup | Direktur CCC | Wakil 1 CCC      | Wakil 2 CCC      | Wakil 3 CCC      |
+----+---------------+----------+--------------+------------------+------------------+------------------+

Maka table-nya menjadi sebagai berikut

Untuk menggabungkan beberapa row menjadi satu bagian kita menggunakan fungsi group_concat(), misal kita ingin mengelompokkan nama-nama direktur berdasarkan jenis perusahaannya, maka kita bisa menggunakan query;

 select jenis as 'Jenis', group_concat(direktur) as 'Nama-Nama Direktur' from perusahaan group by jenis;
+----------+---------------------------+
| Jenis    | Nama-Nama Direktur        |
+----------+---------------------------+
| Terbuka  | Direktur ZZZ              |
| Tertutup | Direktur AAA,Direktur CCC |
+----------+---------------------------+

Sedangkan untuk menggabungkan beberapa kolom dalam row yang sama, kita bisa menggunakan fungsi concat_ws(), misal disini kita akan menggabungkan Nama-nama anggota dewan direktur di setiap perusahaan, maka query-nya adalah;

 select perusahaan_id as 'Kode Perusahaan', concat_ws(',', direktur, wakil_direktur_1, wakil_direktur_2, wakil_direktur_3) as 'Jajaran Direktur' from perusahaan;
+-----------------+--------------------------------------------------+
| Kode Perusahaan | Jajaran Direktur                                 |
+-----------------+--------------------------------------------------+
|               1 | Direktur AAA,Wakil 1 AAA,,                       |
|             200 | Direktur ZZZ,Wakil 1 ZZZ,,Wakil 3 ZZZ            |
|               3 | Direktur CCC,Wakil 1 CCC,Wakil 2 CCC,Wakil 3 CCC |
+-----------------+--------------------------------------------------+

Pada kasus percobaan kita hasil diatas terlihat ada sedikita kesalahan dimana ternyata concat_ws() juga menganggap string kosong ada dan dipisahkan dengan koma, padahal kita ingin jika string kosong itu diabaikan, misal pada perusahaan dengan kode 200 disitu hasilnya “Direktur ZZZ,Wakil 1 ZZZ,,Wakil 3 ZZZ”. Maka disini query-nya tinggal kita modifikasi sedikit dengan fungsi if() untuk merubah string kosong menjadi NULL, sehingga menjadi;

 select perusahaan_id as 'Kode Perusahaan', concat_ws(',', if(direktur!='',direktur, NULL), if(wakil_direktur_1!='',wakil_direktur_1, NULL),if(wakil_direktur_2!='',wakil_direktur_2, NULL), if(wakil_direktur_3!='',wakil_direktur_3, NULL)) as 'Jajaran Direktur' from perusahaan;
+-----------------+--------------------------------------------------+
| Kode Perusahaan | Jajaran Direktur                                 |
+-----------------+--------------------------------------------------+
|               1 | Direktur AAA,Wakil 1 AAA                         |
|             200 | Direktur ZZZ,Wakil 1 ZZZ,Wakil 3 ZZZ             |
|               3 | Direktur CCC,Wakil 1 CCC,Wakil 2 CCC,Wakil 3 CCC |
+-----------------+--------------------------------------------------+

Nah mudah kan, tentang karakter separatornya bisa diganti-ganti sesuai dengan kebutuhan, caranya tinggal lihat aja di link dokumentasi diatas.😀

One thought on “Tips Menggabungkan String dengan Karakter Tertentu Sebagai Pemisah/Separator di Query MySQL

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s