SQL Server: CASE-WHEN
Tổng quan
CASE-WHEN dùng để thiết lập điều kiện rẽ nhánh trong SQL. CASE-WHEN có thể áp dụng được cho các câu lệnh DML gồm SELECT và UPDATE.
Dưới đây sẽ hướng dẫn cách sử dụng CASE-WHEN cho câu lệnh SELECT, bạn có thể xem cách sử dụng CASE-WHEN cho câu lệnh UPDATE tại bài viết về UPDATE.
Khi sử dụng cho SELECT thì CASE-WHEN sẽ thể hiện ở một cột riêng và ta có thể đặt bí danh cho cột này.
Cú pháp
Có hai cú pháp sử dụng CASE-WHEN được thể hiện cụ thể như sau:
Cú pháp 1
SELECT Các_cột, Bí_danh = CASE Tên_cột
WHEN Giá_trị1 then Hiển_thị1
WHEN Giá_trị2 then Hiển_thị2
...
ELSE Hiển_thị
END
FROM Các_bảng_liên_kết [WHERE Điều_kiện];
Hoặc:
SELECT Các_cột, CASE Tên_cột
WHEN Giá_trị1 then Hiển_thị1
WHEN Giá_trị2 then Hiển_thị2
...
ELSE Hiển_thị
END AS Bí_danh
FROM Các_bảng_liên_kết [WHERE Điều_kiện];
Ví dụ cho Cú pháp 1
Giả sử bảng Student có các dữ liệu sau đây:
studentid | studentname | gender |
---|---|---|
1 | A | 1 |
2 | B | 0 |
3 | C | Null |
4 | A | 0 |
Bây giờ ta muốn hiển thị toàn bộ dữ liệu của bảng Student trong đó cột gender sẽ hiển thị 'Male' thay cho 1, 'Female' thay cho 0 và 'Unknow' thay cho Null. Ta làm như sau:
SELECT studentid, studentname, GENDER = CASE gender
WHEN 1 then 'Male'
WHEN 0 then 'Female'
ELSE 'Unknow'
END
FROM Student;
Hoặc:
SELECT studentid, studentname, CASE gender
WHEN 1 then 'Male'
WHEN 0 then 'Female'
ELSE 'Unknow'
END AS GENDER
FROM Student;
Kết quả sẽ hiển thị như sau:
studentid | studentname | GENDER |
---|---|---|
1 | A | Male |
2 | B | Female |
3 | C | Unknow |
4 | A | Female |
Cú pháp 2
SELECT Các_cột, Bí_danh = CASE
WHEN Điều_kiện1 then Hiển_thị1
WHEN Điều_kiện2 then Hiển_thị2
...
ELSE Hiển_thị
END
FROM Các_bảng_liên_kết [WHERE Điều_kiện];
Hoặc:
SELECT Các_cột, CASE
WHEN Điều_kiện1 then Hiển_thị1
WHEN Điều_kiện2 then Hiển_thị2
...
ELSE Hiển_thị
END AS Bí_danh
FROM Các_bảng_liên_kết [WHERE Điều_kiện];
Ví dụ cho Cú pháp 2
Hiển thị tên khách hàng, tổng số tiền mua hàng của từng khách và hiển thị cột Level với giá trị điền vào cột này theo tiêu chí sau: Nếu tổng số tiền mua hàng của từng khách < 5000 thì điền giá trị là 'Level1', từ 5000 đến < 10000 thì điền giá trị là 'Level2', >=10000 thì điền giá trị là 'V.I.P' (Câu 14 bài tập Practical 4). Ta giải quyết yêu cầu này như sau:
SELECT c.Ten, SUM(b.SoLuongMua * a.DonGia) AS [TongTienMua], [Level] = CASE
WHEN SUM(b.SoLuongMua * a.DonGia) < 5000 THEN 'Level 1'
WHEN SUM(b.SoLuongMua * a.DonGia) >= 5000 AND SUM(b.SoLuongMua * a.DonGia) < 10000 THEN 'Level 2'
WHEN SUM(b.SoLuongMua * a.DonGia) >= 10000 THEN 'V.I.P'
ELSE 'Unknow'
END
FROM Item a JOIN CustomerItem b ON a.MaHang=b.Mahang JOIN Customer c ON b.MaKhach=c.MaKhach
GROUP BY c.Ten;
Hoặc:
SELECT c.Ten, SUM(b.SoLuongMua * a.DonGia) AS [TongTienMua], CASE
WHEN SUM(b.SoLuongMua * a.DonGia) < 5000 THEN 'Level 1'
WHEN SUM(b.SoLuongMua * a.DonGia) >= 5000 AND SUM(b.SoLuongMua * a.DonGia) < 10000 THEN 'Level 2'
WHEN SUM(b.SoLuongMua * a.DonGia) >= 10000 THEN 'V.I.P'
ELSE 'Unknow'
END AS [Level]
FROM Item a JOIN CustomerItem b ON a.MaHang=b.Mahang JOIN Customer c ON b.MaKhach=c.MaKhach
GROUP BY c.Ten;