CodeGym /Các khóa học /SQL SELF /Biểu thức điều kiện: CASE <biểu_thức> WHEN ... THEN ... ...

Biểu thức điều kiện: CASE <biểu_thức> WHEN ... THEN ... ELSE ... END

SQL SELF
Mức độ, Bài học
Có sẵn

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, value2 v.v.
  • THEN chỉ 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ẽ ra NULL nếu không khớp giá trị nào.
  • So sánh với NULL → không chạy, hãy dùng IS NULL và CASE tìm kiếm.
  • So sánh kiểu không tương thích → ví dụ, CASE grade WHEN '5' nếu grade là 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.

2
Nhiệm vụ
SQL SELF, mức độ, bài học
Đã khóa
Gán mô tả văn bản cho điểm số
Gán mô tả văn bản cho điểm số
2
Nhiệm vụ
SQL SELF, mức độ, bài học
Đã khóa
So sánh các loại sản phẩm
So sánh các loại sản phẩm
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION