Nếu bạn đã quen với CASE, cách nhúng logic trực tiếp vào truy vấn. Nhưng không phải ai cũng biết CASE có hai dạng. Nếu CASE WHEN ... là kiểm tra điều kiện kiểu if-else, thì CASE đơn giản giống như switch-case trong các ngôn ngữ khác: nó so sánh một biểu thức với nhiều giá trị và thực hiện block tương ứng.
Nó trông gọn và dễ hiểu hơn khi bạn so sánh một trường với các giá trị cố định.
Cú pháp CASE đơn giản
CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
...
ELSE default_result
END
Rất đơn giản:
expression— là biểu thức hoặc trường sẽ được so sánh với các giá trịvalue1,value2v.v.THENchỉ ra sẽ trả về gì nếu khớp.ELSE— trả về gì nếu không khớp cái nào (có thể bỏ qua, nhưng tốt nhất là nên dùng).
Ví dụ: Điểm số sinh viên
Giả sử có bảng students với cột grade, chứa số nguyên từ 2 đến 5. Ta muốn hiển thị diễn giải điểm bằng chữ.
SELECT
name,
grade,
CASE grade
WHEN 5 THEN 'Xuất sắc'
WHEN 4 THEN 'Tốt'
WHEN 3 THEN 'Đạt'
WHEN 2 THEN 'Không đạt'
ELSE 'Không rõ'
END AS diem_bang_chu
FROM students;
Ở đây CASE so sánh giá trị trường grade với các giá trị cố định 2, 3, 4, 5.
Ví dụ: Danh mục sản phẩm theo mã
Trong bảng products có trường category_code, chứa các nhãn ngắn: 'el', 'frn', 'bks' v.v. Ta muốn hiển thị tên danh mục dễ đọc.
SELECT
product_name,
category_code,
CASE category_code
WHEN 'el' THEN 'Điện tử'
WHEN 'frn' THEN 'Nội thất'
WHEN 'bks' THEN 'Sách'
ELSE 'Khác'
END AS category_name
FROM products;
Cách này cực tiện khi cần hiển thị text "dễ hiểu" thay cho mã.
Ví dụ: Tên các tháng
Đôi khi muốn hiển thị tên tháng dưới dạng chữ theo số:
SELECT
EXTRACT(MONTH FROM order_date) AS month_number,
CASE EXTRACT(MONTH FROM order_date)
WHEN 1 THEN 'Tháng Một'
WHEN 2 THEN 'Tháng Hai'
WHEN 3 THEN 'Tháng Ba'
WHEN 4 THEN 'Tháng Tư'
WHEN 5 THEN 'Tháng Năm'
WHEN 6 THEN 'Tháng Sáu'
WHEN 7 THEN 'Tháng Bảy'
WHEN 8 THEN 'Tháng Tám'
WHEN 9 THEN 'Tháng Chín'
WHEN 10 THEN 'Tháng Mười'
WHEN 11 THEN 'Tháng Mười Một'
WHEN 12 THEN 'Tháng Mười Hai'
ELSE 'Không rõ'
END AS month_name
FROM orders;
Ở đây CASE đơn giản giúp mọi thứ dễ hiểu hơn thay vì chỉ là số từ 1 đến 12.
Làm việc với NULL trong CASE đơn giản
Quan trọng là nếu giá trị so sánh là NULL, kết quả sẽ là NULL, vì NULL = NULL — không phải true, mà là không xác định.
Ví dụ với NULL:
SELECT
user_id,
status,
CASE status
WHEN 'active' THEN 'Hoạt động'
WHEN 'blocked' THEN 'Bị chặn'
WHEN NULL THEN 'Không có trạng thái' -- sẽ không chạy!
ELSE 'Không rõ'
END AS trang_thai_nguoi_dung
FROM users;
Thay vì WHEN NULL nên dùng ELSE, hoặc dùng CASE tìm kiếm (đã học ở bài trước):
CASE
WHEN status IS NULL THEN 'Không có trạng thái'
...
So sánh với CASE tìm kiếm
| Đặc điểm | CASE đơn giản | CASE tìm kiếm |
|---|---|---|
| So sánh với giá trị cụ thể | ✅ Tiện | ❌ Không hợp |
| Linh hoạt điều kiện (>, IS NULL) | ❌ Không được | ✅ Được |
| Tương tự trong lập trình | switch-case |
if-else |
Tình huống thực tế
Ví dụ: Hiển thị trạng thái yêu cầu
| request_id | status |
|---|---|
| 101 | new |
| 102 | in_progress |
| 103 | done |
| 104 | cancelled |
| 105 | NULL |
SELECT
request_id,
CASE status
WHEN 'new' THEN '🟡 Mới'
WHEN 'in_progress' THEN '🔵 Đang xử lý'
WHEN 'done' THEN '🟢 Hoàn thành'
ELSE '⚪ Không rõ'
END AS nhan_trang_thai
FROM requests;
| request_id | nhan_trang_thai |
|---|---|
| 101 | 🟡 Mới |
| 102 | 🔵 Đang xử lý |
| 103 | 🟢 Hoàn thành |
| 104 | ⚪ Không rõ |
| 105 | ⚪ Không rõ |
Ở đây CASE như một "phiên dịch viên": biến trạng thái kỹ thuật thành nhãn dễ hiểu (và còn cute nữa). Nếu trạng thái không rõ hoặc NULL — user sẽ thấy ⚪ "Không rõ".
Ví dụ: Nhóm theo danh mục cho báo cáo
| employee_id | name | department |
|---|---|---|
| 1 | Alex Lin | HR |
| 2 | Maria Chi | IT |
| 3 | Anna Song | IT |
| 4 | Otto Art | FIN |
| 5 | Jane Doe | HR |
| 6 | Max Gray | SALES |
| 7 | Zoe Black | IT |
| 8 | Tom Brown | FIN |
| 9 | Liam Park | NULL |
| 10 | Eva Gold | HR |
SELECT
CASE department
WHEN 'HR' THEN 'Nhân sự'
WHEN 'IT' THEN 'Công nghệ'
WHEN 'FIN' THEN 'Tài chính'
ELSE 'Khác'
END AS ten_phong_ban,
COUNT(*) AS so_nhan_vien
FROM employees
GROUP BY
CASE department
WHEN 'HR' THEN 'Nhân sự'
WHEN 'IT' THEN 'Công nghệ'
WHEN 'FIN' THEN 'Tài chính'
ELSE 'Khác'
END;
Kết quả:
| ten_phong_ban | so_nhan_vien |
|---|---|
| Nhân sự | 3 |
| Công nghệ | 3 |
| Tài chính | 2 |
| Khác | 2 |
Ở đây có gì:
- Nhân viên phòng HR vào nhóm Nhân sự.
- IT — là Công nghệ.
- FIN — là Tài chính.
- Mọi thứ còn lại, kể cả SALES và NULL, vào Khác. Cách này cực hợp để tạo báo cáo thân thiện, dễ hiểu.
Lỗi thường gặp
- Quên
ELSE→ sẽ raNULLnếu không khớp giá trị nào. - So sánh với
NULL→ không chạy, hãy dùngIS NULLvà CASE tìm kiếm. - So sánh kiểu không tương thích → ví dụ,
CASE grade WHEN '5'nếugradelà kiểu số.
CASE đơn giản — là công cụ của bạn khi cần so sánh một giá trị với nhiều khả năng. Nó gọn, dễ đọc và cực kỳ hữu ích cho phân loại text, hiển thị, chuyển đổi mã và nhóm dữ liệu tiện lợi.
Nếu bạn cần kiểm tra khoảng giá trị, NULL, hoặc điều kiện phức tạp hơn — hãy dùng CASE tìm kiếm. SQL thích sự rõ ràng. Và CASE — là công cụ để bạn làm cho mọi thứ rõ ràng hơn.
GO TO FULL VERSION