Kursus
Saat bekerja dengan data dunia nyata, nilai yang hilang hampir tak terelakkan. Baik saat Anda membersihkan dataset atau menggabungkan kolom, SQL menawarkan solusi yang sederhana namun kuat: fungsi COALESCE(). Tutorial ini akan menunjukkan cara kerja COALESCE(), kapan menggunakannya, dan bagaimana menerapkannya melalui contoh praktis—semua hanya dalam beberapa baris SQL.
Apa Itu COALESCE() dalam SQL?
Fungsi COALESCE() dalam SQL mengembalikan nilai pertama yang bukan null dari daftar ekspresi. Jika semua nilainya null, maka akan mengembalikan null. Fungsi ini umum digunakan untuk menangani nilai yang hilang atau menggabungkan beberapa kolom menjadi satu keluaran cadangan.
Kapan Sebaiknya Menggunakan COALESCE()?
Fungsi ini berguna saat menggabungkan nilai dari beberapa kolom menjadi satu.
Misalnya, sebuah tabel bernama users memuat nilai work_email dan personal_email milik pengguna.
Dengan menggunakan fungsi COALESCE(), kita dapat membuat kolom bernama email, yang menampilkan work_email pengguna jika tidak null. Jika tidak, akan menampilkan personal_email.
|
|
|
|
|
|
1 |
angel@datacamp.com |
null |
angel@datacamp.com |
|
2 |
null |
bruce@gmail.com |
bruce@gmail.com |
|
3 |
cath@datacamp.com |
cath@gmail.com |
cath@datacamp.com |
Sintaks COALESCE()
COALESCE(value_1, value_2, ...., value_n)
Fungsi COALESCE() menerima setidaknya satu nilai (value_1). Fungsi ini akan mengembalikan nilai pertama yang bukan null dalam daftar, dari kiri ke kanan.
Misalnya, fungsi akan terlebih dahulu memeriksa apakah value_1 bernilai null. Jika tidak, maka akan mengembalikan value_1. Jika ya, fungsi memeriksa apakah value_2 bernilai null. Proses ini berlanjut hingga daftar selesai.
COALESCE() dapat digunakan dengan kolom, ekspresi, atau konstanta.
Contoh Praktis COALESCE()
Jalankan dan edit kode dari tutorial ini secara online.
Jalankan kodeContoh 1: Mengganti null dengan konstanta
Pertimbangkan tabel countries yang berisi daftar negara dan hari nasionalnya. Beberapa nilai hari nasional bernilai null. COALESCE() mengisi nilai yang hilang pada national_day dengan string konstan 'Unknown'.
SELECT
country_id,
name,
national_day,
COALESCE(national_day, 'Unknown') AS national_day_coalesced
FROM countries
ORDER BY country_id
Hasilnya sebagai berikut:
|
|
|
|
|
|
1 |
Aruba |
null |
Unknown |
|
2 |
Afghanistan |
1919-08-19T00:00:00.000Z |
1919-08-19 |
|
3 |
Angola |
1975-11-11T00:00:00.000Z |
1975-11-11 |
|
4 |
Anguilla |
1967-05-30T00:00:00.000Z |
1967-05-30 |
Perhatikan bagaimana nilai null pada national_day diganti dengan konstanta Unknown.
Contoh 2: Memilih di antara dua kolom
Kita memiliki tabel bernama products. Tabel ini berisi nama produk dan deskripsinya. Beberapa deskripsi terlalu panjang (lebih dari 60 karakter). Dalam kasus tersebut, kita mengganti deskripsi dengan nama produk.
Kueri berikut menggunakan CASE untuk mengonversi deskripsi panjang menjadi NULL, lalu menggunakan COALESCE() untuk kembali menggunakan nama produk.
SELECT DISTINCT
product_name,
description,
COALESCE(
CASE WHEN
LENGTH(description) >= 60
THEN NULL
ELSE description
END,
product_name) product_name_or_description
FROM products
Hasilnya sebagai berikut:
product_name |
|
|
|
G.Skill Ripjaws V Series |
"Speed:DDR4-3200,Type:288-pin DIMM,CAS:14Module:4x16GBSize:64GB" |
G.Skill Ripjaws V Series |
|
G.Skill Ripjaws V Series |
"Speed:DDR4-3200,Type:288-pin DIMM,CAS:15Module:4x16GBSize:64GB" |
G.Skill Ripjaws V Series |
|
Asus X99-E-10G WS |
"CPU:LGA2011-3,Form Factor:SSI CEB,RAM Slots:8,Max RAM:128GB" |
"CPU:LGA2011-3,Form Factor:SSI CEB,RAM Slots:8,Max RAM:128GB" |
|
Supermicro X9SRH-7TF |
"CPU:LGA2011,Form Factor:ATX,RAM Slots:8,Max RAM:64GB" |
"CPU:LGA2011,Form Factor:ATX,RAM Slots:8,Max RAM:64GB" |
Perhatikan bagaimana kolom product_name_or_description menampilkan product_name jika description panjang. Jika tidak, kolom ini menampilkan description.
Contoh 3: Logika fallback dengan beberapa kolom
Kita dapat membawa contoh 2 selangkah lebih jauh. Asumsikan saat ini ada dua persyaratan:
- Jika panjang
descriptionkurang dari 60, maka tampilkandescription. - Jika tidak, periksa apakah panjang
product_namekurang dari 20. Jika ya, tampilkanproduct_name. - Jika tidak, tampilkan
product.
SELECT DISTINCT
product_name,
description,
COALESCE(
CASE
WHEN LENGTH(description) > 50
THEN NULL
ELSE description
END,
CASE
WHEN LENGTH(product_name) > 14
THEN NULL
ELSE product_name
END,
'product') AS product_name_or_description
FROM products
ORDER BY product_name
Hasilnya sebagai berikut:
|
|
|
|
|
ADATA ASU800SS-128GT-C |
Series:Ultimate SU800,Type:SSD,Capacity:128GB,Cache:N/A |
product |
|
ADATA ASU800SS-512GT-C |
Series:Ultimate SU800,Type:SSD,Capacity:512GB,Cache:N/A |
product |
|
AMD 100-5056062 |
Chipset:Vega Frontier Edition Liquid,Memory:16GBCore Clock:1.5GHz |
product |
|
AMD 100-505989 |
Chipset:FirePro W9100,Memory:32GBCore Clock:930MHz |
Chipset:FirePro W9100,Memory:32GBCore Clock:930MHz |
Perhatikan bagaimana kolom product_name_or_description menampilkan product_name atau description bergantung pada panjang product_name atau description.
Mesin SQL yang Didukung
COALESCE() berfungsi di SQL Server (mulai 2008), Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse, BigQuery, dan Amazon RedShift.
Fungsi SQL Terkait
Pemikiran Akhir
Fungsi COALESCE() adalah alat serbaguna untuk menangani nilai null dan menyederhanakan kueri SQL Anda. Baik saat Anda mengganti data yang hilang dengan nilai default atau menggabungkan beberapa kolom menjadi satu, COALESCE() membantu menjaga logika tetap bersih dan mudah dibaca.
Siap memperdalam keterampilan SQL Anda? Lihat kursus pemula yang ramah dan meningkatkan karier di DataCamp berikut ini:
FAQs
Apa yang terjadi jika semua nilai dalam COALESCE() adalah NULL?
Jika setiap argumen yang diberikan ke fungsi COALESCE() adalah NULL, maka fungsi akan mengembalikan NULL.
Apa perbedaan COALESCE() dengan ISNULL() atau IFNULL()?
ISNULL()(SQL Server) danIFNULL()(MySQL, SQLite) hanya menerima dua argumen.-
COALESCE()dapat menerima banyak argumen dan lebih standar di berbagai dialek SQL. -
COALESCE()adalah bagian dari standar ANSI SQL, sedangkanISNULL()danIFNULL()bersifat spesifik basis data.
Bisakah saya menggunakan COALESCE() dengan ekspresi atau fungsi?
Ya, Anda dapat menggunakan nama kolom, literal, fungsi, atau ekspresi di dalam COALESCE().
COALESCE(LOWER(name), 'unknown')Apakah ada biaya kinerja saat menggunakan COALESCE()?
Secara umum, tidak—COALESCE() efisien. Namun, jika Anda menggunakannya dengan ekspresi yang kompleks atau di dalam kueri besar, basis data mungkin mengevaluasi lebih banyak ekspresi daripada yang diperlukan, tergantung pada cara penulisannya.
Apakah COALESCE() berfungsi dengan tipe data yang berbeda?
Ya, tetapi semua argumen harus dapat dikonversi secara implisit ke tipe data umum. Jika tidak, mungkin terjadi kesalahan konversi tipe tergantung pada mesin SQL Anda.
Bisakah saya melakukan nesting fungsi COALESCE()?
Ya, Anda dapat melakukan nesting, meskipun jarang diperlukan karena COALESCE() sudah menangani banyak argumen:
COALESCE(col1, COALESCE(col2, 'default'))
Ini setara dengan:
COALESCE(col1, col2, 'default')
