Khi có 2 cột và muốn lấy giá trị của cột nào **không phải NULL** (ưu tiên cột 1, nếu NULL thì lấy cột 2), MySQL cung cấp 4 cách tiếp cận.
Cú pháp 4 phương pháp
1. IFNULL() - 2 đối số, chỉ MySQL
SELECT IFNULL(cot1, cot2) AS ket_qua FROM ten_bang;
2. COALESCE() - Chuẩn ANSI SQL, nhiều đối số
SELECT COALESCE(cot1, cot2) AS ket_qua FROM ten_bang;
3. CASE WHEN - Linh hoạt, chuẩn SQL
SELECT CASE
WHEN cot1 IS NOT NULL THEN cot1
ELSE cot2
END AS ket_qua FROM ten_bang;
4. IF() - Hàm điều kiện MySQL
SELECT IF(cot1 IS NULL, cot2, cot1) AS ket_qua FROM ten_bang;
Ví dụ minh họa
1. Tạo bảng
CREATE TABLE SelectNotNullColumnsDemo (
Id INT NOT NULL AUTO_INCREMENT,
Name VARCHAR(20),
Age INT,
PRIMARY KEY(Id)
);
2. Chèn dữ liệu (mỗi hàng 1 cột NULL)
INSERT INTO SelectNotNullColumnsDemo(Name, Age) VALUES('John', NULL);
INSERT INTO SelectNotNullColumnsDemo(Name, Age) VALUES(NULL, 23);
3. Xem dữ liệu
SELECT * FROM SelectNotNullColumnsDemo;
Kết quả:
+----+------+------+
| Id | Name | Age |
+----+------+------+
| 1 | John | NULL |
| 2 | NULL | 23 |
+----+------+------+
4. Kết quả 4 phương pháp (giống nhau)
-- Cách 1: IFNULL
SELECT IFNULL(Name, Age) AS NotNULLValue FROM SelectNotNullColumnsDemo;
-- Cách 2: COALESCE
SELECT COALESCE(Name, Age) AS NotNULLValue FROM SelectNotNullColumnsDemo;
-- Cách 3: CASE
SELECT CASE WHEN Name IS NOT NULL THEN Name ELSE Age END AS NotNULLValue
FROM SelectNotNullColumnsDemo;
-- Cách 4: IF
SELECT IF(Name IS NULL, Age, Name) AS NotNULLValue FROM SelectNotNullColumnsDemo;
Kết quả (tất cả 4 cách):
+--------------+
| NotNULLValue |
+--------------+
| John |
| 23 |
+--------------+
So sánh chi tiết
| Tiêu chí | IFNULL | COALESCE | CASE | IF |
|---|---|---|---|---|
| Số đối số | 2 | ≥2 | Linh hoạt | 3 |
| Chuẩn SQL | MySQL only | ANSI | ANSI | MySQL only |
| Xử lý kiểu dữ liệu khác nhau | Ép kiểu ngầm | Ép kiểu ngầm | Kiểm soát rõ ràng | Ép kiểu ngầm |
| Điều kiện phức tạp | Không | Không | Có | Có (lồng nhau) |
| Hiệu năng | Rất nhanh | Rất nhanh | Nhanh | Nhanh |
Mở rộng: 3+ cột fallback
-- COALESCE: Lấy cột đầu tiên không NULL
SELECT COALESCE(cot1, cot2, cot3, 'MacDinh') FROM bang;
-- CASE: Logic phức tạp
SELECT CASE
WHEN cot1 IS NOT NULL THEN cot1
WHEN cot2 IS NOT NULL THEN CONCAT('[', cot2, ']')
WHEN cot3 IS NOT NULL THEN UPPER(cot3)
ELSE 'Khong co du lieu'
END FROM bang;
Khuyến nghị
- 2 cột, đơn giản:
COALESCE(cot1, cot2)(chuẩn SQL, dễ đọc) - Nhiều cột fallback:
COALESCE(cot1, cot2, cot3, ...) - Logic điều kiện/định dạng:
CASE WHEN ... - Tránh IFNULL/IF nếu cần code portable sang PostgreSQL, SQL Server, Oracle