COALESCE mengembalikan nilai pertama dalam daftarnya yang bukan NULL. Inilah cara SQL mengganti nilai yang hilang dengan nilai cadangan. Contoh-contohnya berjalan di PostgreSQL, MySQL, SQLite, dan SQL Server.
Cara menggunakan COALESCE
Berikan COALESCE nilai sebanyak apa pun. Fungsi ini memeriksanya dari kiri ke kanan dan mengembalikan nilai pertama yang bukan NULL, atau NULL jika semuanya NULL:
COALESCE(value1, value2, ...)
SELECT COALESCE(NULL, 'second', 'third');
-- Output: second
SELECT COALESCE(NULL, NULL);
-- Output: NULL
Dalam query nyata, nilainya biasanya berupa kolom, dengan literal di akhir sebagai pilihan terakhir:
-- Input: users
-- id | name | nickname
-- ---+--------------+---------
-- 1 | Maria Garcia | Mia
-- 2 | Tom Becker | NULL
-- 3 | Priya Shah | P
SELECT id, name, COALESCE(nickname, name) AS display_name
FROM users;
-- Output:
-- id | name | display_name
-- ---+--------------+-------------
-- 1 | Maria Garcia | Mia
-- 2 | Tom Becker | Tom Becker
-- 3 | Priya Shah | P
Aturan yang perlu diketahui
- Ia berhenti di nilai non-NULL pertama, sehingga argumen berikutnya tidak dievaluasi begitu satu nilai ditemukan. Letakkan nilai yang paling sering terisi di urutan pertama.
- Setiap argumen harus bertipe kompatibel. Mencampur angka dengan teks akan gagal di PostgreSQL dan SQL Server, jadi lakukan cast terlebih dahulu:
-- Input: products
-- name | stock
-- -------------+------
-- Desk Lamp | 12
-- Office Chair | NULL
SELECT name, COALESCE(stock, 'N/A') AS stock FROM products;
-- PostgreSQL: ERROR: invalid input syntax for type integer: "N/A"
-- SQL Server: Conversion failed when converting the varchar value 'N/A' to data type int.
-- (in MySQL, cast with CAST(stock AS CHAR))
SELECT name, COALESCE(CAST(stock AS VARCHAR(10)), 'N/A') AS stock FROM products;
-- Output:
-- name | stock
-- -------------+------
-- Desk Lamp | 12
-- Office Chair | N/A
-
String kosong bukan NULL. COALESCE meloloskan
''begitu saja. Bungkus kolom denganNULLIF(column, '')agar string kosong juga dianggap hilang:
SELECT COALESCE('', 'No name');
-- Output: '' (an empty string)
SELECT COALESCE(NULLIF('', ''), 'No name');
-- Output: No name
Sintaks alternatif
Anda juga akan menemui pintasan dua argumen: IFNULL di MySQL dan SQLite, serta ISNULL di SQL Server:
SELECT IFNULL(NULL, 'fallback');
-- Output: fallback
Sebaiknya gunakan COALESCE. Fungsi ini menerima argumen sebanyak apa pun, sedangkan ISNULL di SQL Server memberi hasilnya tipe argumen pertama, yang bisa memotong nilai cadangan Anda:
-- SQL Server
DECLARE @code VARCHAR(2) = NULL;
SELECT ISNULL(@code, 'none') AS with_isnull, COALESCE(@code, 'none') AS with_coalesce;
-- Output:
-- with_isnull | with_coalesce
-- ------------+--------------
-- no | none
Ekspresi CASE bisa melakukan hal yang sama, hanya lebih panjang: COALESCE(nickname, name) adalah singkatan dari CASE WHEN nickname IS NOT NULL THEN nickname ELSE name END. Lihat panduan pernyataan SQL CASE untuk saat Anda butuh kemampuan lebih.
Kapan sebaiknya menggunakan COALESCE?
Gunakan COALESCE setiap kali NULL akan membuat hasil Anda salah, jelek, atau kosong. Sebagian besar penggunaannya masuk ke salah satu dari empat kategori ini.
Beralih ke kolom lain
Saat nilai yang Anda cari ada di salah satu dari beberapa kolom, COALESCE memilih yang pertama terisi: nama panggilan atau nama lengkap, nomor ponsel atau telepon rumah, alamat pengiriman atau alamat penagihan.
Gunakan nilai default saat semua nilai kosong
Letakkan literal di akhir daftar, dan hasilnya tidak akan pernah NULL. Inilah yang Anda inginkan untuk laporan dan tampilan, di mana “Address Unknown” atau 0.00 lebih enak dibaca daripada kolom kosong.
Isi kekosongan dengan nilai hasil perhitungan
Nilai cadangan tidak harus berupa kolom atau konstanta. Bisa juga berupa ekspresi, misalnya username atau alamat email yang dibentuk dari kolom lain, sehingga COALESCE sangat berguna untuk merapikan data hasil impor.
Jauhkan NULL dari perhitungan
Aritmetika apa pun dengan NULL menghasilkan NULL, sehingga diskon atau bonus yang kosong menghapus seluruh total. COALESCE(discount, 0) mengubah nilai yang hilang menjadi angka yang bisa dipakai dalam perhitungan.
Contoh nyata COALESCE
Tampilkan harga, apa pun yang tersedia
Produk bisa punya harga diskon, harga normal, atau (sebelum peluncuran) tidak keduanya. Periksa secara berurutan dan gunakan nol sebagai default:
-- Input: products
-- product_id | name | sale_price | regular_price
-- -----------+---------------+------------+--------------
-- 1 | Desk Lamp | 19.99 | 24.99
-- 2 | Office Chair | NULL | 149.00
-- 3 | Standing Desk | NULL | NULL
SELECT product_id, name, COALESCE(sale_price, regular_price, 0.00) AS price
FROM products;
-- Output:
-- product_id | name | price
-- -----------+---------------+-------
-- 1 | Desk Lamp | 19.99
-- 2 | Office Chair | 149.00
-- 3 | Standing Desk | 0.00
Pilih nomor telepon terbaik untuk dihubungi
Kontak memiliki hingga tiga nomor. Tampilkan nomor pertama yang tersedia, dan beri keterangan jika tidak ada:
-- Input: contacts
-- name | primary_phone | mobile_phone | work_phone
-- -----+---------------+--------------+-----------
-- Ada | 555-0101 | 555-0199 | NULL
-- Bo | NULL | 555-0142 | 555-0177
-- Cy | NULL | NULL | 555-0123
-- Di | NULL | NULL | NULL
SELECT name, COALESCE(primary_phone, mobile_phone, work_phone, 'No phone') AS phone
FROM contacts;
-- Output:
-- name | phone
-- -----+---------
-- Ada | 555-0101
-- Bo | 555-0142
-- Cy | 555-0123
-- Di | No phone
Buat alamat email pengganti
Karyawan yang tidak punya email tercatat akan mendapat email yang dibentuk dari namanya, sehingga setiap baris di direktori memiliki nilai:
-- Input: employees
-- employee_id | first_name | last_name | email
-- ------------+------------+-----------+-----------------
-- 1 | Grace | Hopper | ghopper@navy.mil
-- 2 | Alan | Turing | NULL
SELECT
employee_id,
first_name || ' ' || last_name AS full_name,
COALESCE(
email,
LOWER(first_name) || '.' || LOWER(last_name) || '@company.com'
) AS email
FROM employees;
-- Output:
-- employee_id | full_name | email
-- ------------+--------------+------------------------
-- 1 | Grace Hopper | ghopper@navy.mil
-- 2 | Alan Turing | alan.turing@company.com
Di MySQL dan SQL Server, gabungkan string dengan CONCAT() alih-alih ||.
Hitung total pesanan saat diskon bersifat opsional
Tanpa COALESCE, satu baris tanpa diskon membuat total seluruh pesanan menjadi salah, karena SUM melewati baris NULL sepenuhnya:
-- Input: order_items
-- order_id | product | quantity | unit_price | discount
-- ---------+----------+----------+------------+---------
-- 101 | Keyboard | 1 | 49.00 | 5.00
-- 101 | Mouse | 2 | 19.50 | NULL
-- 102 | Monitor | 1 | 189.00 | NULL
-- 102 | Cable | 3 | 6.00 | 2.00
-- Wrong: lines with a NULL discount drop out of the total
SELECT order_id, SUM(quantity * unit_price - discount) AS total
FROM order_items
GROUP BY order_id
ORDER BY order_id;
-- Output:
-- order_id | total
-- ---------+------
-- 101 | 44.00
-- 102 | 16.00
-- Right: a missing discount counts as 0
SELECT order_id, SUM(quantity * unit_price - COALESCE(discount, 0)) AS total
FROM order_items
GROUP BY order_id
ORDER BY order_id;
-- Output:
-- order_id | total
-- ---------+-------
-- 101 | 83.00
-- 102 | 205.00
Bacaan lanjutan tentang COALESCE
Di blog ini:
-
MySQL COALESCE: COALESCE beserta
IFNULLmilik MySQL - Panduan pernyataan SQL CASE: logika kondisional di luar pengecekan NULL
- Panduan SQL not equal: mengapa perbandingan dengan NULL tidak pernah cocok
- Panduan SQL GROUP BY: fungsi agregat yang sering menerima hasil COALESCE
- Panduan SQL SUBSTRING: mengambil teks dari kolom yang mungkin NULL
Dokumentasi resmi:
Beekeeper Studio Adalah GUI Database Gratis & Open Source
Tool query & editor SQL terbaik yang pernah saya pakai. Semua yang saya butuhkan untuk mengelola database ada di sini. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio cepat, intuitif, dan mudah digunakan. Beekeeper mendukung banyak sekali database, dan berjalan mulus di Windows, Mac, dan Linux.
Apa Kata Pengguna tentang Beekeeper Studio
"Beekeeper Studio benar-benar menggantikan alur kerja SQL lama saya. Cepat, intuitif, dan membuat pekerjaan database kembali menyenangkan."
"Saya sudah mencoba banyak GUI database, tetapi Beekeeper punya keseimbangan sempurna antara fitur dan kesederhanaan. Langsung jalan."