Cara Menggabungkan String dalam Kuery Group By PostgreSQL
Ketika bekerja dengan database, terutama dengan PostgreSQL, Anda mungkin menemui skenario umum di mana Anda perlu menggabungkan string di dalam sekelompok catatan. Ini biasanya muncul ketika Anda memiliki dataset yang mencakup beberapa entri untuk satu kategori (seperti karyawan dalam perusahaan yang sama) dan Anda ingin mengumpulkan entri-entri tersebut menjadi satu string untuk presentasi atau analisis.
Postingan blog ini akan menjelaskan bagaimana mencapai penggabungan string dengan kuery GROUP BY
di PostgreSQL. Kami akan membahas solusi modern serta pendekatan untuk versi PostgreSQL yang lebih lama untuk pemahaman yang komprehensif.
Masalahnya
Misalnya, pertimbangkan tabel karyawan berikut:
ID | COMPANY_ID | EMPLOYEE |
---|---|---|
1 | 1 | Anna |
2 | 1 | Bill |
3 | 2 | Carol |
4 | 2 | Dave |
Anda ingin mengelompokkan entri-entri ini berdasarkan COMPANY_ID
sehingga output menyajikan daftar karyawan yang terkait dengan setiap perusahaan. Output yang diinginkan akan terlihat seperti ini:
COMPANY_ID | EMPLOYEE |
---|---|
1 | Anna, Bill |
2 | Carol, Dave |
Solusinya
PostgreSQL 9.0 atau Lebih Baru
Jika Anda menggunakan versi PostgreSQL 9.0 atau lebih baru, Anda dapat menggunakan fungsi bawaan yang kuat string_agg()
untuk menggabungkan string dalam klausa GROUP BY
Anda dengan efektif.
Berikut cara Anda bisa menulis kuery tersebut:
SELECT company_id, string_agg(employee, ', ')
FROM mytable
GROUP BY company_id;
Dengan Pengurutan
Selain itu, karena versi PostgreSQL 9.0 mendukung ORDER BY
dalam fungsi agregat, Anda dapat menentukan urutan karyawan:
SELECT company_id, string_agg(employee, ', ' ORDER BY employee)
FROM mytable
GROUP BY company_id;
Ini memastikan bahwa nama karyawan Anda digabungkan dalam urutan tertentu.
PostgreSQL 8.4.x
Jika Anda masih bekerja dengan PostgreSQL 8.4, yang merupakan versi yang tidak lagi mendapat dukungan, Anda dapat menggunakan fungsi array_agg()
yang dikombinasikan dengan array_to_string()
untuk mencapai hasil serupa. Berikut kuery SQL yang akan Anda gunakan:
SELECT company_id, array_to_string(array_agg(employee), ', ')
FROM mytable
GROUP BY company_id;
PostgreSQL 8.3.x dan Versi Sebelumnya
Untuk pengguna PostgreSQL 8.3 dan versi sebelumnya, tidak ada fungsi bawaan untuk melakukan penggabungan string secara langsung. Implementasi kustom berikut dapat mengatasi keterbatasan ini:
- Buat fungsi agregat baru menggunakan fungsi
textcat
:
CREATE AGGREGATE textcat_all(
basetype = text,
sfunc = textcat,
stype = text,
initcond = ''
);
- Untuk menyertakan pemisah seperti
,
di antara string yang digabungkan, buat fungsi kustom:
CREATE FUNCTION commacat(acc text, instr text) RETURNS text AS $$
BEGIN
IF acc IS NULL OR acc = '' THEN
RETURN instr;
ELSE
RETURN acc || ', ' || instr;
END IF;
END;
$$ LANGUAGE plpgsql;
Ini akan menggabungkan string dengan tepat.
Jika Anda ingin menghapus koma tambahan untuk nilai NULL
atau kosong, berikut versi yang lebih diperhalus:
CREATE FUNCTION commacat_ignore_nulls(acc text, instr text) RETURNS text AS $$
BEGIN
IF acc IS NULL OR acc = '' THEN
RETURN instr;
ELSIF instr IS NULL OR instr = '' THEN
RETURN acc;
ELSE
RETURN acc || ', ' || instr;
END IF;
END;
$$ LANGUAGE plpgsql;
Kesimpulan
Menggabungkan string dalam PostgreSQL, terutama selama operasi GROUP BY
, sangat penting untuk menghasilkan laporan dan dataset yang bermakna. Dengan diperkenalkannya fungsi seperti string_agg()
dalam versi terbaru, tugas ini telah menjadi sederhana.
Jika Anda menggunakan versi yang lebih lama, menggunakan metode agregasi kustom yang dijelaskan di sini dapat mencapai hasil serupa. Selalu pertimbangkan untuk memperbarui versi PostgreSQL Anda untuk memanfaatkan fitur baru dan perbaikan keamanan.
Selamat mencoba kueri!