Giới thiệu
Biểu thức CASE WHEN cho phép logic điều kiện phức tạp trong SELECT. Ví dụ: Trả về NULL nếu cột A là NULL, ngược lại trả về cột B.
1. Tạo bảng và dữ liệu
mysql> create table DemoTable (
-> Name varchar(20),
-> Marks1 int,
-> Marks2 int
-> );
Query OK, 0 rows affected (0.72 sec)
mysql> insert into DemoTable values('Chris',45,null);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('David',null,78);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('Bob',67,98);
Query OK, 1 row affected (0.14 sec)
2. Dữ liệu gốc
mysql> select *from DemoTable;
+-------+--------+--------+ | Name | Marks1 | Marks2 | +-------+--------+--------+ | Chris | 45 | NULL | | David | NULL | 78 | | Bob | 67 | 98 | +-------+--------+--------+ 3 rows in set (0.00 sec)
3. Truy vấn CASE WHEN
mysql> select *,
-> (case when Marks1 is null then null else Marks2 end) as Value
-> from DemoTable;
4. Kết quả
+-------+--------+--------+-------+ | Name | Marks1 | Marks2 | Value | +-------+--------+--------+-------+ | Chris | 45 | NULL | NULL | | David | NULL | 78 | NULL | | Bob | 67 | 98 | 98 | +-------+--------+--------+-------+ 3 rows in set (0.00 sec)
Giải thích:
- Chris: Marks1=45 (không NULL) → trả về Marks2=NULL
- David: Marks1=NULL → trả về NULL (không quan tâm Marks2)
- Bob: Marks1=67 → trả về Marks2=98
Cú pháp CASE đầy đủ:
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
END
Hàm tiện ích tương đương: IF(Marks1 IS NULL, NULL, Marks2) hoặc NULLIF(Marks1, NULL) (không chính xác). MySQL cũng có COALESCE nhưng dùng cho trường hợp khác.