Khi truy vấn dữ liệu, thường cần hiển thị giá trị thay thế cho NULL thay vì để trống. MySQL cung cấp 3 cách chính: IFNULL(), COALESCE(), và CASE.
So sánh nhanh
| Phương pháp | Độ phức tạp | Chuẩn SQL | Hỗ trợ nhiều giá trị fallback |
|---|---|---|---|
IFNULL(expr, val) | Đơn giản | MySQL only | Không (chỉ 2 đối số) |
COALESCE(v1, v2, ...) | Đơn giản | ANSI SQL | Có (nhiều đối số) |
CASE WHEN ... | Linh hoạt | ANSI SQL | Có (điều kiện phức tạp) |
Ví dụ minh họa
1. Tạo bảng
CREATE TABLE ReplaceNULLDemo (
Id INT NOT NULL AUTO_INCREMENT,
Name VARCHAR(10),
Marks INT,
PRIMARY KEY(Id)
);
2. Chèn dữ liệu (có NULL)
INSERT INTO ReplaceNULLDemo(Name, Marks) VALUES
('Larry', 90), ('Carol', NULL), ('David', NULL),
('Bob', 67), ('Sam', 78), ('Mike', NULL), ('John', 98);
3. Xem dữ liệu gốc
SELECT * FROM ReplaceNULLDemo;
Kết quả: Marks có NULL ở hàng 2, 3, 6.
Cách 1: IFNULL() - Đơn giản, chỉ MySQL
SELECT IFNULL(Marks, 0) AS ReplacementOfNULLWith0
FROM ReplaceNULLDemo;
Kết quả: NULL → 0, các giá trị khác giữ nguyên.
Cách 2: COALESCE() - Chuẩn ANSI, nhiều fallback
SELECT COALESCE(Marks, 0) AS ReplacementOfNULLWith0
FROM ReplaceNULLDemo;
Ưu điểm: Có thể chuỗi fallback: COALESCE(cot1, cot2, cot3, 0) - trả về giá trị đầu tiên không NULL.
Cách 3: CASE WHEN - Linh hoạt nhất
SELECT CASE
WHEN Marks IS NULL THEN 0
ELSE Marks
END AS ReplacementOfNULLWith0
FROM ReplaceNULLDemo;
Ưu điểm: Xử lý logic phức tạp:
SELECT CASE
WHEN Marks IS NULL THEN 'Chưa có điểm'
WHEN Marks < 50 THEN 'Yếu'
WHEN Marks < 70 THEN 'Trung bình'
ELSE 'Tốt'
END AS XepLoai
FROM ReplaceNULLDemo;
Kết quả so sánh (cả 3 cách cho kết quả giống nhau)
+------------------------+
| ReplacementOfNULLWith0 |
+------------------------+
| 90 |
| 0 |
| 0 |
| 67 |
| 78 |
| 0 |
| 98 |
+------------------------+
Khuyến nghị sử dụng
- Thay thế đơn giản 1 giá trị: Dùng
IFNULL()(ngắn gọn) hoặcCOALESCE()(chuẩn SQL) - Nhiều cấp fallback:
COALESCE(cot_chinh, cot_phu, 'mac_dinh') - Logic điều kiện phức tạp:
CASE WHEN ... - Hiển thị chuỗi cho NULL:
COALESCE(CAST(cot AS CHAR), 'N/A')
Lưu ý
- Các hàm này chỉ ảnh hưởng kết quả
SELECT, không sửa dữ liệu gốc - Để cập nhật dữ liệu thực: dùng
UPDATE ... SET cot = COALESCE(cot, 0) WHERE cot IS NULL IFNULLvàCOALESCEtrả về kiểu dữ liệu của đối số đầu tiên không NULL