CASE trả về 1 biểu thức kết quả thỏa biểu thức điều kiện trong SQL
Khi bạn sử dụng nhuần nhuyển và có chiều sâu về CASE thì đây cũng là một lợi thế của bạn về SQL. CASE rất đa dạng, linh hoạt và rất hữu ích, ứng dụng trong nhiều trường hợp. CASE trong SQL dùng để đánh giá một danh sách các điều kiện và trả về 1 trong các biểu thức kết quả thỏa mãn điều kiện đánh ...
Khi bạn sử dụng nhuần nhuyển và có chiều sâu về CASE thì đây cũng là một lợi thế của bạn về SQL. CASE rất đa dạng, linh hoạt và rất hữu ích, ứng dụng trong nhiều trường hợp.
CASE trong SQL dùng để đánh giá một danh sách các điều kiện và trả về 1 trong các biểu thức kết quả thỏa mãn điều kiện đánh giá
CASE có 2 định dạng:
- Chức năng CASE đơn giản hay còn gọi là simple CASE
- Chức năng CASE tìm kiếm hay còn gọi là searched CASE
Trong đó:
- Simple CASE là so sánh một biểu thức với một bộ các biểu thức đơn giản để xác định kết quả.
- Searched CASE là đánh giá một bộ các biểu thức Boolean để xác định kết quả
Cả 2 định dạng trên đều hỗ trợ đối số ELSE (nhưng không bắt buộc)
Cú pháp:
Simple CASE:
CASE input_expression WHEN when_expression THEN result_expression [ ...n ] [ ELSE else_result_expression ] END
Searched CASE:
CASE WHEN Boolean_expression THEN result_expression [ ...n ] [ ELSE else_result_expression ] END
Trong đó:
- input_expression: là một biểu thức đánh giá khi sử dụng định dạng simple CASE, input_expression là bất cứ biểu thức SQL nào, miễn là hợp lệ
- WHEN when_expression: là biểu thức đơn giản dùng để so sánh với biểu thức input_expression khi sử dụng định dạng Simple CASE. when_expression là một biểu thức SQL bất kỳ miễn là hợp lệ. Kiểu dữ liệu của 2 biểu thức: input_expression và when_expression phải giống nhau, nếu không giống nhau thì đổi về cùng một kiểu dữ liệu, có thể dùng các hàm chuyển đổi như CAST, …
- n: có ý là WHEN when_expression THEN result_expression hoặc WHEN Boolean_expression THEN result_expression có thể lặp lại n lần, áp dụng cho trường hợp Simple CASE và Searched CASE
- THEN result_expression: là biểu thức kết quả trả về khi input_expression = when_expression trong Simple CASE, hoặc khi Boolean_expression = TRUE trong Searched CASE. result_expression là một biểu thức SQL bất kỳ miễn là hợp lệ.
- ELSE else_result_expression: là biểu thức kết quả trả về khi input_expression không thỏa bất cứ when_expression trong Simple CASE, hoặc khi tất cả Boolean_expression trả về FALSE trong Searched CASE. else_result_expression phải cùng kiểu dữ liệu với result_expression, nếu khác kiểu thì phải chuyển đổi về cho cùng kiểu (có thể dùng hàm CAST để chuyển đổi kiểu dữ liệu).
- WHEN Boolean_expression: là một biểu thức trả về kiểu boolean (TRUE hoặc FALSE) được sử dụng trong Searched CASE. Boolean_expression là bất kỳ biểu thức Boolean nào miễn là hợp lệ.
- END: là từ khóa dùng để đóng CASE lại
Đó là 2 cú pháp được định nghĩa trên SQL hơi dài dòng một tí, cho nên Góc Kinh Nghiệm sẽ tóm tắt đơn giản dễ hiểu như sau:
Simple CASE:
CASE biểu_thức_đầu_vào WHEN biểu_thức_1 THEN biểu_thức_kết_quả_1 WHEN biểu_thức_2 THEN biểu_thức_kết_quả_2 … WHEN biểu_thức_n THEN biểu_thức_kết_quả_3 ELSE biểu_thức_kết_quả END
Searched CASE:
CASE WHEN biểu_thức_điều-kiện_1 THEN biểu_thức_kết_quả_1 WHEN biểu_thức_ điều-kiện _2 THEN biểu_thức_kết_quả_2 … WHEN biểu_thức_ điều-kiện _n THEN biểu_thức_kết_quả_n ELSE biểu_thức_kết_quả END
Để thấy sự khác biệt rõ ràng hơn giữa Simple CASE và Searched CASE, Góc Kinh Nghiệm sẽ sử dùng 2 chức năng của CASE ở trên vào 2 ví dụ cụ thể.
Ví dụ 1: Simple CASE:
Giả sử bạn cần kiểm tra trạng thái của thiết bị, dựa vào cột Code (mã) của bảng DeviceStatus (danh sách trạng thái thiết bị):
- nếu Code = ‘01’ là ‘Đang sử dụng’
- nếu Code = ‘02’ là ‘Đang bảo trì’
- nếu Code = ‘03’ là ‘Đang nâng cấp’
- ngược lại, tức là không thuộc từ 1 đến 3 thì thiết bị ‘Đang trong kho’
Ví dụ trên được chuyển qua simple CASE cú pháp như sau:
SELECT DeviceName, Code, (CASE code WHEN '01' THEN N'Đang sử dụng' WHEN '02' THEN N'Đang bảo trì' WHEN '03' THEN N'Đang nâng cấp' ELSE N'Đang trong kho' END) AS Status FROM DeviceStatus ORDER BY Code
Simple CASE rất dễ sử dụng, tương tự như switch … case trong C#.
Kết quả thu được:
DeviceName | Code | Status |
Laptop Compaq CQ21 | 01 | Đang sử dụng |
Máy lạnh C32 | 02 | Đang bảo trì |
Chuột đen K23 | 04 | Đang trong kho |
Ổ điện KTM | 12 | Đang trong kho |
Ví dụ: Searched CASE
Giả sử bạn cần phân loại số điểm để xếp loại học lực của học sinh, dựa vào cột Score (điểm) của bảng ScoreList (Danh sách ghi nhận điểm của học sinh):
- nếu >= 9 điểm: xếp loại ‘Xuất sắc’
- nếu >= 8 điểm: xếp loại ‘Giỏi’
- nếu >=6.5 điểm: xếp loại ‘Khá’
- nếu >=5 điểm: xếp loại ‘Trung bình’
- Ngược lại: tức từ dưới 5 điểm thì xếp loại ‘Dưới trung bình’
Ví dụ trên được chuyển qua Searched Case như sau:
SELECT StudentName, Score, (CASE WHEN Score >= 9 THEN N'Xuất sắc' WHEN Score >= 8 THEN N'Giỏi' WHEN Score >= 6.5 THEN N'Khá' WHEN Score >= 5 THEN N'Trung bình' ELSE N'Dưới trung bình' END) AS Range FROM ScoreList ORDER BY Score DESC
Kết quả thu được như bảng bên dưới:
StudentName | Score | Range |
Đoàn Văn Đảm | 10 | Xuất sắc |
Trần Xuân Vũ | 8.5 | Giỏi |
Nguyễn Khánh Hưng | 8 | Giỏi |
Ngô Thiên Hạ | 7.3 | Khá |
Đoàn Thanh Thúy | 3.5 | Dưới trung bình |
Đinh Toàn Mỹ | 2.4 | Dưới trung bình |
Ghi chú: bạn thấy trong 2 ví dụ trên, sau từ khóa THEN có ký tự N’chuỗi_ký_tự’, ký tự N ở đây hỗ trợ tiếng Việt có dấu, nếu bạn không dùng tiếng Việt có đấu có thể bỏ qua ký thự N
Chắc chắn qua 2 ví dụ này thì mọi thứ rất rõ ràng và dễ sử dụng.
Chức năng CASE này tương tự với chức năng COALESCE
Góc Kinh Nghiệm chúc các bạn thành công và sớm làm quen, chinh phục CASE