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 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_expressionwhen_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  :lol:

 


16 comments

  1. Rất chi tiết và dễ hiểu! Vừa mới hỏi Case là có bài viết liền ^^! Thanks!

    P/S: thiếu từ dài trong đoạn “…định nghĩa trên SQL hơi dòng một tí…”

  2. Tóm lại là Simple CASE và Searched CASE khác nhau ở điểm nào? Tôi thấy trong ví dụ thì cú pháp là như nhau:
    case … when … then

    1. Bạn đọc kỹ bày viết nhé. Simple Case là bạn truyền vào biểu thức bình thường, còn Searched Case thì phải truyền vào biểu thức điều kiện. Ngay cái tên đã nói lên sự khác nhau của nó rồi đó bạn :) Chúc bạn thành công.

  3. Bài viết rấ hay và dễ hiểu, mình có góp ý nho nhỏ:
    Bạn viết sai chính tả ở từ rất quan trọng “tiếng việc” bạn nên sửa lại thành “Tiếng Việt” để tôn trọng giá trị đất nước mình

Leave a Reply

Your email address will not be published. Required fields are marked *