TopDev

Cách sử dụng CASE WHEN trong Oracle như thế nào

minhu 📖 5 phút đọc 💬 2 phản hồi

Trong Oracle SQL, câu lệnh CASE WHEN được sử dụng để thực hiện các điều kiện giống như câu lệnh IF...ELSE trong các ngôn ngữ lập trình. Đây là cú pháp giúp bạn xử lý các điều kiện logic trực tiếp trong truy vấn SQL.



✅ Cú pháp cơ bản#

CASE WHEN điều_kiện_1 THEN giá_trị_1 WHEN điều_kiện_2 THEN giá_trị_2 ... ELSE giá_trị_mặc_định END

🟢 Ví dụ 1: Gán hạng cho điểm số#

SELECT student_name, score, CASE WHEN score >= 90 THEN 'Xuất sắc' WHEN score >= 70 THEN 'Khá' WHEN score >= 50 THEN 'Trung bình' ELSE 'Yếu' END AS grade FROM students;



✅ CASE trong mệnh đề WHERE#

SELECT * FROM employees WHERE department_id = CASE WHEN job_id = 'IT_PROG' THEN 60 WHEN job_id = 'HR_REP' THEN 40 ELSE department_id END;



✅ CASE trong mệnh đề ORDER BY#

SELECT employee_name, job_id FROM employees ORDER BY CASE WHEN job_id = 'MANAGER' THEN 1 WHEN job_id = 'CLERK' THEN 2 ELSE 3 END;



✅ Cú pháp dạng CASE đơn giản (sử dụng biểu thức so sánh)#

CASE biểu_thức WHEN giá_trị_1 THEN kết_quả_1 WHEN giá_trị_2 THEN kết_quả_2 ... ELSE kết_quả_mặc_định END

🟢 Ví dụ 2: Kiểm tra loại sản phẩm#

SELECT product_name, category_id, CASE category_id WHEN 1 THEN 'Điện tử' WHEN 2 THEN 'Gia dụng' WHEN 3 THEN 'Thời trang' ELSE 'Khác' END AS category_name FROM products;



✅ Lưu ý#

  • CASE có thể dùng ở bất kỳ đâu trong câu SQL: SELECT, WHERE, ORDER BY, GROUP BY, thậm chí trong UPDATEINSERT.

  • Oracle hỗ trợ cả Searched CASE (điều kiện linh hoạt) và Simple CASE (so sánh biểu thức với giá trị cụ thể).



Trong Oracle SQL, bạn có thể kết hợp CASE WHEN với hàm COUNT để đếm có điều kiện — tức là chỉ đếm những dòng thỏa mãn điều kiện cụ thể.



✅ Cú pháp đếm có điều kiện với COUNT(CASE WHEN ...)#

SELECT COUNT(CASE WHEN điều_kiện THEN 1 END) AS ten_cot FROM ten_bang;



🟢 Ví dụ 1: Đếm số sinh viên theo từng hạng điểm#

Giả sử bạn có bảng students(score):

SELECT COUNT(CASE WHEN score >= 90 THEN 1 END) AS xuat_sac, COUNT(CASE WHEN score >= 70 AND score < 90 THEN 1 END) AS kha, COUNT(CASE WHEN score >= 50 AND score < 70 THEN 1 END) AS trung_binh, COUNT(CASE WHEN score < 50 THEN 1 END) AS yeu FROM students;



🟢 Ví dụ 2: Đếm số nhân viên theo giới tính trong từng phòng ban#

Giả sử bảng employees(department_id, gender):

SELECT department_id, COUNT(CASE WHEN gender = 'M' THEN 1 END) AS nam, COUNT(CASE WHEN gender = 'F' THEN 1 END) AS nu FROM employees GROUP BY department_id;



🟢 Ví dụ 3: Đếm số đơn hàng theo trạng thái#

Giả sử bảng orders(status) có các giá trị: 'NEW', 'SHIPPED', 'CANCELLED'

SELECT COUNT(CASE WHEN status = 'NEW' THEN 1 END) AS don_moi, COUNT(CASE WHEN status = 'SHIPPED' THEN 1 END) AS da_giao, COUNT(CASE WHEN status = 'CANCELLED' THEN 1 END) AS da_huy FROM orders;



✅ Ghi nhớ:#

  • COUNT(CASE WHEN ... THEN 1 END) đếm số bản ghi thỏa mãn điều kiện.

  • Không nên dùng COUNT(CASE WHEN ... THEN 'text' END) nếu có khả năng giá trị là NULL, vì COUNT không đếm NULL.

2 phản hồi

  1. minhu #1

    Câu sau của bạn:

    COUNT(CASE WHEN CHANNEL != 'REFUND' THEN 1 ELSE 0 END) AS dem

    🚫 Không đúng hoàn toàn vì:

    • **Hàm COUNT(...) chỉ đếm các giá trị khác NULL.

    • Nếu bạn dùng ELSE 0, thì 0 vẫn là một giá trị không NULL, nên nó sẽ luôn được đếm, kể cả khi điều kiện sai.



    ✅ Cách đúng:#

    COUNT(CASE WHEN CHANNEL != 'REFUND' THEN 1 END) AS dem

    🔍 Giải thích:#

    • Khi điều kiện đúng → CASE ... THEN 1COUNT đếm 1.

    • Khi điều kiện sai → CASE ... trả về NULLCOUNT không đếm.



    🧪 So sánh kết quả#

    Giả sử bảng như sau:

    ID CHANNEL
    1 SALE
    2 SALE
    3 REFUND
    4 SALE

    Dùng sai:#

    COUNT(CASE WHEN CHANNEL != 'REFUND' THEN 1 ELSE 0 END) = 4

    Vì cả 10 đều không phải NULL, COUNT đếm hết.

    Dùng đúng:#

    COUNT(CASE WHEN CHANNEL != 'REFUND' THEN 1 END) = 3

    Chỉ đếm những dòng CHANNEL != 'REFUND'.



    ✅ Nếu bạn muốn đếm cả REFUND và NON-REFUND trong 1 câu:#

    SELECT COUNT(*) AS tong, COUNT(CASE WHEN CHANNEL = 'REFUND' THEN 1 END) AS so_refund, COUNT(CASE WHEN CHANNEL != 'REFUND' THEN 1 END) AS so_khong_refund FROM your_table;

  2. minhu #2

    Bạn muốn kết hợp CASE WHEN với SUM thì cũng rất phổ biến, thường dùng để tính tổng có điều kiện.



    ✅ Cách dùng SUM với CASE WHEN#

    SUM(CASE WHEN điều_kiện THEN giá_trị_cần_tính ELSE 0 END) AS ten_cot

    Ở đây, khi điều kiện đúng, bạn cộng giá trị; nếu không thì cộng 0 (không làm thay đổi tổng).



    🟢 Ví dụ 1: Tổng doanh thu loại sản phẩm không phải REFUND#

    Giả sử bảng sales có cột CHANNELamount (số tiền bán):

    SELECT SUM(CASE WHEN CHANNEL != 'REFUND' THEN amount ELSE 0 END) AS tong_doanh_thu_khong_refund, SUM(CASE WHEN CHANNEL = 'REFUND' THEN amount ELSE 0 END) AS tong_doanh_thu_refund FROM sales;



    🟢 Ví dụ 2: Tính tổng số lượng bán theo từng trạng thái#

    SELECT SUM(CASE WHEN status = 'NEW' THEN quantity ELSE 0 END) AS so_luong_moi, SUM(CASE WHEN status = 'SHIPPED' THEN quantity ELSE 0 END) AS so_luong_da_giao, SUM(CASE WHEN status = 'CANCELLED' THEN quantity ELSE 0 END) AS so_luong_da_huy FROM orders;



    ✅ Lưu ý#

    • Nếu bạn dùng SUM(CASE WHEN ... THEN 1 ELSE 0 END) → giống như đếm có điều kiện, nhưng dùng COUNT sẽ hiệu quả hơn.

    • SUM phù hợp khi bạn muốn cộng giá trị số, ví dụ: tiền, số lượng, điểm,...

Bài liên quan trong #Oracle

✓ Đã sao chép link