Vấn đề: Lấy giá trị đầu tiên khác NULL từ danh sách cột/biểu thức
Cần trả về StudentName nếu có, nếu NULL thì lấy StudentSubject.
Giải pháp: Hàm COALESCE()
COALESCE(val1, val2, ..., valN) trả về giá trị đầu tiên không NULL. Nếu tất cả NULL → trả NULL.
1. Tạo bảng và dữ liệu
CREATE TABLE DemoTable (
StudentName VARCHAR(20),
StudentSubject VARCHAR(20)
);
INSERT INTO DemoTable VALUES
('Chris', 'MySQL'),
('David', NULL),
(NULL, 'MongoDB');
2. Dữ liệu
+-------------+----------------+
| StudentName | StudentSubject |
+-------------+----------------+
| Chris | MySQL |
| David | NULL |
| NULL | MongoDB |
+-------------+----------------+
3. Truy vấn COALESCE
SELECT COALESCE(StudentName, StudentSubject) AS Result
FROM DemoTable;
4. Kết quả
+---------+
| Result |
+---------+
| Chris |
| David |
| MongoDB |
+---------+
So sánh COALESCE vs IFNULL vs CASE
| Hàm | Số đối số | Chuẩn SQL | Ví dụ |
|---|---|---|---|
COALESCE | 2+ | Có (ANSI) | COALESCE(a,b,c) |
IFNULL | 2 | MySQL only | IFNULL(a,b) |
CASE | Linh hoạt | Có | CASE WHEN a IS NOT NULL THEN a ELSE b END |
Ứng dụng thực tế
- Hiển thị tên hiển thị:
COALESCE(nickname, fullname, username, 'Guest'). - Giá trị mặc định cho cột có thể NULL:
COALESCE(discount, 0). - Trong
ORDER BY:ORDER BY COALESCE(priority, 999)– NULL xếp cuối.
Lưu ý
COALESCEđánh giá từng đối số theo thứ tự – dừng ở giá trị đầu tiên không NULL (short-circuit).- Tất cả đối số nên cùng kiểu dữ liệu (hoặc có thể chuyển đổi ngầm).