Memecah String Menjadi Baris di SQL
TL;DR
Memecah string di SQL berarti ngubah satu kolom teks berpemisah, misalnya 'apel,jeruk,mangga', jadi beberapa baris terpisah. Di PostgreSQL, cara paling gampang pakai string_to_table atau unnest(string_to_array(...)). Di SQL Server pakai STRING_SPLIT dengan CROSS APPLY, dan di MySQL 8 pakai recursive CTE atau JSON_TABLE. Ini kebalikan dari STRING_AGG yang justru nggabungin baris jadi satu teks.
Memecah string di SQL berarti ngubah satu kolom teks berpemisah, misalnya 'apel,jeruk,mangga', jadi beberapa baris terpisah biar tiap nilai bisa dihitung dan disaring sendiri.
Data model kayak ini sering muncul dari kolom tag, kategori, atau daftar produk yang dijejalin ke satu sel. Selama masih nyatu, kamu susah ngitung atau nge-filter per nilai. Setelah dipecah, tiap nilai jadi baris yang gampang diolah.
Di artikel ini kamu bakal belajar cara mecah string di PostgreSQL, SQL Server, dan MySQL, plus contoh nyata dari data produk UMKM.
Kenapa perlu memecah string jadi baris?
Nyimpen banyak nilai dalam satu sel, dipisah koma, ngelanggar prinsip data yang rapi. Kolom kayak gini bikin kamu nggak bisa JOIN, GROUP BY, atau filter per nilai dengan bener. Mecahnya jadi baris ngembaliin data ke bentuk yang bisa dianalisa.
Prinsip nyimpen satu nilai per sel ini bagian dari normalisasi data. Operasi mecah string ini kebalikan persis dari STRING_AGG yang nggabungin baris jadi satu teks. Satu misahin, satu nyatuin.
Gimana cara memecah string di PostgreSQL?
PostgreSQL punya beberapa cara. Yang paling ringkas sejak versi 14 adalah string_to_table, yang langsung ngubah teks berpemisah jadi kumpulan baris.
SELECT p.id, trim(t) AS tag
FROM produk p, string_to_table(p.tags, ',') AS t;
Fungsi trim di sini penting buat ngilangin spasi di sekitar tiap nilai, soalnya 'apel, jeruk' sering punya spasi setelah koma. Tanpa trim, tag-nya jadi ' jeruk' dengan spasi di depan.
Buat PostgreSQL versi lama yang belum punya string_to_table, pakai kombinasi unnest dan string_to_array yang hasilnya sama.
SELECT p.id, trim(t) AS tag
FROM produk p
CROSS JOIN unnest(string_to_array(p.tags, ',')) AS t;
Kalau pemisahnya nggak konsisten, misalnya kadang pakai spasi kadang nggak, pakai regexp_split_to_table biar lebih tahan variasi.
SELECT id, regexp_split_to_table(tags, '\s*,\s*') AS tag
FROM produk;
Gimana cara memecah string di SQL Server dan MySQL?
SQL Server punya fungsi bawaan STRING_SPLIT sejak versi 2016. Pasangin dengan CROSS APPLY biar tiap baris asal dipecah jadi banyak baris.
SELECT p.id, s.value AS tag
FROM produk p
CROSS APPLY STRING_SPLIT(p.tags, ',') AS s;
MySQL agak ribet karena nggak punya fungsi split bawaan sampai versi terbaru. Di MySQL 8, cara paling umum pakai recursive CTE atau ubah teksnya jadi JSON dulu lalu pakai JSON_TABLE. Kalau datamu banyak dan sering dipecah, mendingan benerin desain tabelnya di awal daripada mecah tiap query.
Contoh kasus: tag produk toko_berkah
Aku pegang tabel produk toko_berkah dengan 240 baris. Ada kolom tags yang isinya kategori dipisah koma, kayak 'sembako, promo, laris'. Aku mau tau tag mana yang paling sering nempel di produk.
SELECT trim(t) AS tag, COUNT(*) AS jumlah
FROM produk p, string_to_table(p.tags, ',') AS t
GROUP BY trim(t)
ORDER BY jumlah DESC;
Setelah dipecah, 240 produk berubah jadi 612 baris tag. Rata-rata tiap produk punya 2,55 tag. Hasilnya nunjukin tag 'sembako' nempel di 41% produk (98 dari 240), disusul 'promo' di 27%. Tanpa mecah string dulu, angka ini mustahil dihitung karena semua tag ketumpuk di satu sel.
Dari sini aku bisa lanjut, misalnya cari produk yang punya tag 'promo' tapi bukan 'laris', buat evaluasi promo yang nggak jalan.
Kesalahan umum memecah string
- Lupa trim spasi. Nilai kayak ' jeruk' dengan spasi di depan bakal dianggap beda dari 'jeruk'.
- Ngandelin urutan hasil. Beberapa fungsi split nggak jamin urutan. Kalau butuh posisi, pakai fungsi yang ngasih nomor indeks.
- Nilai kosong kebawa. String kayak 'a,,b' bisa ngasih baris kosong di tengah. Saring pakai WHERE kalau nggak diinginkan.
- Mecah tiap query padahal bisa dibenerin desainnya. Kalau kolom ini sering dipecah, mendingan simpan di tabel terpisah sejak awal.
FAQ
Pertanyaan yang sering muncul soal memecah string di SQL.
Penutup
Memecah string ngubah data yang ketumpuk jadi baris yang bisa dianalisa. Di PostgreSQL pakai string_to_table atau unnest, di SQL Server pakai STRING_SPLIT dengan CROSS APPLY. Jangan lupa trim spasi tiap nilai, dan saring baris kosong kalau perlu.
Kalau kolom berpemisah ini sering kamu olah, pertimbangkan benerin desain tabelnya sejak awal. Mau operasi kebalikannya? Baca STRING_AGG dan GROUP_CONCAT. Buat kasus di spreadsheet, ada fungsi SPLIT Google Sheets. Detail fungsinya ada di dokumentasi PostgreSQL string functions. Mau latihan query SQL? Kulik di NgulikSQL.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
Semi Join dan Anti Join di SQL: Filter Pakai Tabel Lain
Semi join ngambil baris yang punya pasangan di tabel lain, anti join ngambil yang nggak punya. Keduanya filter, bukan gabung kolom. Ini cara nulisnya di SQL pakai EXISTS dan NOT EXISTS.
EXISTS vs IN di SQL: Perbedaan dan Performa (2026)
EXISTS dan IN sama-sama nyaring baris pakai subquery, tapi cara kerja dan performanya beda. Ini panduan milih yang tepat plus jebakan NULL-nya.
Crosstab (Pivot) di PostgreSQL: Ubah Baris Jadi Kolom
Crosstab di PostgreSQL mivot data dari format panjang (baris) jadi format lebar (kolom), mirip pivot table Excel. Butuh extension tablefunc, dan ada alternatif pakai CASE atau FILTER kalau kolomnya tetap.