Cú pháp CASE WHEN
Sử dụng biểu thức CASE trong câu lệnh SELECT để biến đổi giá trị hiển thị:
SELECT
cot1, cot2, ...,
CASE WHEN ten_cot = gia_tri_1 THEN 'gia_tri_moi_1'
WHEN ten_cot = gia_tri_2 THEN 'gia_tri_moi_2'
ELSE 'gia_tri_mac_dinh'
END AS ten_alias
FROM ten_bang;
Ví dụ: Chuyển 0/1 thành 'false'/'true'
1. Tạo bảng
mysql> CREATE TABLE selectReturnDemo ( -> Id INT, -> Name VARCHAR(100), -> isGreaterthan18 TINYINT(1) -> ); Query OK, 0 rows affected (0.62 sec)
2. Chèn dữ liệu
mysql> INSERT INTO selectReturnDemo VALUES(1,'Carol',0); Query OK, 1 row affected (0.23 sec) mysql> INSERT INTO selectReturnDemo VALUES(2,'Bob',1); Query OK, 1 row affected (0.21 sec) mysql> INSERT INTO selectReturnDemo VALUES(3,'Mike',1); Query OK, 1 row affected (0.18 sec) mysql> INSERT INTO selectReturnDemo VALUES(4,'David',0); Query OK, 1 row affected (0.21 sec) mysql> INSERT INTO selectReturnDemo VALUES(5,'Adam',1); Query OK, 1 row affected (0.10 sec)
3. Dữ liệu gốc
mysql> SELECT * FROM selectReturnDemo;
+------+-------+-----------------+ | Id | Name | isGreaterthan18 | +------+-------+-----------------+ | 1 | Carol | 0 | | 2 | Bob | 1 | | 3 | Mike | 1 | | 4 | David | 0 | | 5 | Adam | 1 | +------+-------+-----------------+ 5 rows in set (0.00 sec)
4. Thay thế giá trị hiển thị
mysql> SELECT Id, Name, -> CASE WHEN isGreaterthan18 = 1 THEN 'true' -> ELSE 'false' -> END AS AgeIsGreaterthan18 -> FROM selectReturnDemo;
+------+-------+--------------------+ | Id | Name | AgeIsGreaterthan18 | +------+-------+--------------------+ | 1 | Carol | false | | 2 | Bob | true | | 3 | Mike | true | | 4 | David | false | | 5 | Adam | true | +------+-------+--------------------+ 5 rows in set (0.00 sec)
Các dạng CASE
Simple CASE (so sánh bằng)
CASE ten_cot
WHEN 'A' THEN 'Loại A'
WHEN 'B' THEN 'Loại B'
ELSE 'Khác'
END
Searched CASE (điều kiện phức tạp)
CASE
WHEN diem >= 90 THEN 'Xuất sắc'
WHEN diem >= 70 THEN 'Khá'
WHEN diem >= 50 THEN 'Trung bình'
ELSE 'Yếu'
END
Ứng dụng thực tế
Phân loại độ tuổi
SELECT
name,
age,
CASE
WHEN age < 18 THEN 'Trẻ em'
WHEN age < 60 THEN 'Người lớn'
ELSE 'Người cao tuổi'
END AS age_group
FROM users;
Format trạng thái đơn hàng
SELECT
order_id,
CASE status
WHEN 0 THEN 'Chờ xử lý'
WHEN 1 THEN 'Đang giao'
WHEN 2 THEN 'Đã giao'
WHEN 3 THEN 'Đã hủy'
ELSE 'Không xác định'
END AS status_text
FROM orders;
Tính giá sau khuyến mãi
SELECT
product_name,
price,
CASE
WHEN is_member = 1 THEN price * 0.9
WHEN quantity > 10 THEN price * 0.95
ELSE price
END AS final_price
FROM products;
Lưu ý
- CASE trả về kiểu dữ liệu của nhánh đầu tiên không NULL
- ELSE NULL ngầm định nếu không có ELSE
- Có thể lồng CASE trong CASE
- Không dùng CASE trong WHERE (dùng AND/OR)