SQL Server: CASE-WHEN

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

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 SELECTUPDATE.

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;

» Tiếp: TOP
« Trước: GROUP BY với HAVING
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!