Câu lệnh CASE & Trường hợp lồng nhau trong SQL Server: Ví dụ về T-SQL

Tổng quan về Case ngoài đời thực!

Một lần nữa, trong cuộc sống thực, chúng ta thực hiện những hành động khác nhau tùy thuộc vào kết quả của những điều kiện khác nhau.

Để giải thích rõ hơn, hãy xem xét ví dụ dưới đây:

  • Nếu vé máy bay dưới 100 USD thì tôi sẽ tới Los Angeles.
  • Nếu vé máy bay từ $100 đến $200 thì tôi sẽ đến thăm New York
  • Nếu vé máy bay từ $200 đến $400 thì tôi sẽ đi thăm Châu Âu
  • Nếu không, tôi sẽ thích đến thăm một số địa điểm du lịch gần đó hơn.

Hãy xem xét việc phân loại Điều kiện và Hành động riêng biệt với ví dụ bên dưới:

Điều kiện - Vé máy bay Hành động được thực hiện, chỉ khi Điều kiện là TRUE
Less hơn $ 100 Thăm Los Angeles
Từ $ 100 đến $ 200 thăm New York
Từ $ 200 đến $ 400 Thăm châu âu
Không có điều kiện nào ở trên được đáp ứng Điểm du lịch lân cận

Trong ví dụ trên, chúng ta có thể thấy rằng kết quả của các điều kiện khác nhau đang chi phối hành động riêng biệt. Ví dụ: Khách sẽ chỉ thực hiện hành động đến thăm New York với điều kiện vé máy bay nằm trong khoảng từ 100 đến 200 USD.

Tương tự, câu lệnh MS SQL CASE cũng cung cấp khả năng thực hiện các câu lệnh T-SQL khác nhau dựa trên kết quả của các điều kiện khác nhau.

Câu lệnh CASE trong SQL Server là gì?

Câu lệnh CASE trong SQL Server là phần mở rộng của câu lệnh IF…ELSE. Không giống như IF…ELSE, khi chỉ cho phép tối đa một điều kiện, CASE cho phép người dùng áp dụng nhiều điều kiện để thực hiện các nhóm hành động khác nhau trong MS SQL. Nó trả về một giá trị tương ứng được liên kết với điều kiện do người dùng xác định.

Chúng ta hãy cùng tìm hiểu cách sử dụng Case trong SQL và khái niệm của nó trong các phần sau.

In MSSQL, có hai loại CASE.

  1. TRƯỜNG HỢP ĐƠN GIẢN
  2. TRƯỜNG HỢP đã tìm kiếm

TRƯỜNG HỢP ĐƠN GIẢN

Cú pháp cho trường hợp đơn giản

CASE <Case_Expression>
     WHEN Value_1 THEN Statement_1
     WHEN Value_2 THEN Statement_2
     .
     .
     WHEN Value_N THEN Statement_N
     [ELSE Statement_Else]   
END AS [ALIAS_NAME]

Ở đây,

  • Thông số Trường hợp_Biểu thức biểu thị biểu thức mà cuối cùng chúng ta sẽ được so sánh với Giá trị_1, Giá trị_2, ...
  • Những thông số Tuyên bố_1, Tuyên bố_2… biểu thị các câu lệnh sẽ được thực thi nếu Case_Expression = Giá trị_1, Biểu thức chữ hoa = Giá trị_2, …, v.v.
  • Tóm lại, điều kiện là liệu Case_Expression = Giá trị_N và ACTION là việc thực thi Tuyên bố_N nếu kết quả trên là TRUE.
  • ALIAS_NAME là tùy chọn và là tên bí danh được đặt cho kết quả câu lệnh CASE của SQL Server. Chủ yếu được sử dụng khi chúng ta sử dụng mệnh đề Case trong SQL server select.

Quy tắc cho trường hợp đơn giản

  • Trường hợp đơn giản chỉ cho phép kiểm tra sự bằng nhau của Case_Expression với Value_1 đến Value_N.
  • Case_Expression được so sánh với Giá trị, theo thứ tự bắt đầu từ giá trị đầu tiên, tức là Giá trị_1. Dưới đây là cách tiếp cận thực hiện:
  • Nếu Case_Expression tương đương với Value_1 thì các câu lệnh WHEN…THEN sẽ bị bỏ qua và quá trình thực thi CASE sẽ KẾT THÚC ngay lập tức.
  • Nếu Case_Expression không khớp với Value_1 thì Case_Expression sẽ được so sánh với Value_2 để biết mức độ tương đương. Quá trình so sánh Case_Expression với Value sẽ tiếp tục cho đến khi Case_Expression tìm thấy giá trị tương đương phù hợp từ tập hợp Value_1, Value_2,…
  • Nếu không có gì khớp thì điều khiển sẽ chuyển đến câu lệnh ELSE và Statement_Else sẽ được thực thi.
  • ELSE là tùy chọn.
  • Nếu ELSE không xuất hiện và Case_Expression không khớp với giá trị nào thì Giá trị rỗng sẽ được hiển thị.

Sơ đồ dưới đây minh họa luồng thực thi của Trường hợp đơn giản.

Làm việc của báo cáo trường hợp đơn giản
Làm việc của báo cáo trường hợp đơn giản

Các ví dụ

Giả thiết: Giả sử rằng chúng ta có bảng như 'Guru99' với hai cột và bốn hàng như hiển thị bên dưới:

Trường hợp đơn giản trong SQL Server

Chúng tôi sẽ sử dụng 'Guru99' bảng trong các ví dụ khác

Truy vấn 1: TRƯỜNG HỢP ĐƠN GIẢN với tùy chọn KHÔNG CÓ KHÁC

SELECT Tutorial_ID, Tutorial_name,
CASE Tutorial_name
	WHEN 'SQL' THEN 'SQL is developed by IBM'
	WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
END AS Description
FROM Guru99

Kết quả: Sơ đồ bên dưới giải thích luồng thực thi của TRƯỜNG HỢP ĐƠN GIẢN KHÔNG CÓ TRƯỜNG HỢP KHÁC.

Trường hợp đơn giản trong SQL Server

Truy vấn 2: TRƯỜNG HỢP ĐƠN GIẢN với tùy chọn ELSE.

SELECT Tutorial_ID, Tutorial_name,
CASE Tutorial_name
	WHEN 'SQL' THEN 'SQL is developed by IBM'
	WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
	ELSE 'This is NO SQL language.'
END AS Description
FROM Guru99

Kết quả: Sơ đồ bên dưới giải thích luồng thực thi của TRƯỜNG HỢP ĐƠN GIẢN với ELSE.

Trường hợp đơn giản trong SQL Server

TRƯỜNG HỢP đã tìm kiếm

Cú pháp cho trường hợp tìm kiếm

CASE 
     WHEN <Boolean_Expression_1> THEN Statement_1
     WHEN <Boolean_Expression_2> THEN Statement_2
     .
     .
     WHEN <Boolean_Expression_N> THEN Statement_N
     [ELSE Statement_Else]   
END AS [ALIAS_NAME]

Ở đây,

  • Tham số Boolean_Expression_1, … biểu thị biểu thức sẽ được đánh giá là TRUE hoặc FALSE.
  • Các tham số Statement_1, Statement_2… biểu thị các Câu lệnh sẽ thực thi nếu kết quả Boolean_Expression_1, Boolean_Expression_2 tương ứng của nó là TRUE.
  • Tóm lại, Điều kiện là Boolean_Expression_1,… và ACTION là sự thực thi của Statement_N nếu ở trên boolean_Expression_1 là TRUE.
  • ALIAS_NAME là tùy chọn và là tên bí danh được đặt cho kết quả câu lệnh CASE. Chủ yếu được sử dụng khi chúng ta sử dụng CASE trong mệnh đề select.

Quy tắc cho trường hợp được tìm kiếm

  • Không giống như trường hợp đơn giản, Trường hợp tìm kiếm không chỉ giới hạn ở việc kiểm tra đẳng thức mà còn cho phép biểu thức Boolean.
  • Biểu thức Boolean được đánh giá theo thứ tự bắt đầu từ biểu thức Boolean đầu tiên, tức là biểu thức Boolean_1. Dưới đây là cách tiếp cận thực hiện:
    • Nếu biểu thức Boolean_1 là TRUE thì các câu lệnh WHEN…THEN sẽ bị bỏ qua và quá trình thực thi CASE sẽ KẾT THÚC ngay lập tức.
    • Nếu biểu thức Boolean_1 là FALSE thì biểu thức Boolean_2 được đánh giá cho điều kiện TRUE. Quá trình đánh giá biểu thức Boolean_này sẽ tiếp tục cho đến khi một trong các biểu thức Boolean_trả về TRUE.
    • Nếu không có gì khớp thì điều khiển sẽ chuyển đến câu lệnh ELSE và Statement_Else sẽ được thực thi.
  • Giống như Trường hợp đơn giản ELSE cũng là tùy chọn trong trường hợp Tìm kiếm.
  • Nếu ELSE không xuất hiện và không có biểu thức Boolean_ nào trả về TRUE thì Null sẽ được hiển thị.

Sơ đồ bên dưới minh họa luồng thực thi của Trường hợp được tìm kiếm.

Hoạt động của Tuyên bố trường hợp được tìm kiếm

Hoạt động của Tuyên bố trường hợp được tìm kiếm

Các ví dụ

Truy vấn 1: TRƯỜNG HỢP TÌM KIẾM với tùy chọn KHÔNG KHÁC

SELECT Tutorial_ID, Tutorial_name,
CASE 
 	WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM'
	WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
END AS Description
FROM Guru99

Kết quả: Sơ đồ bên dưới giải thích luồng thực hiện của TRƯỜNG HỢP TÌM KIẾM với KHÔNG CÓ.

Ví dụ CASE đã tìm kiếm trong SQL Server

Truy vấn 2: TRƯỜNG HỢP TÌM KIẾM với ELSE tùy chọn.

SELECT Tutorial_ID, Tutorial_name,
CASE 
	WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM'
	WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
	ELSE 'This is NO SQL language.'
END AS Description
FROM Guru99

Kết quả: Sơ đồ bên dưới giải thích luồng thực hiện of TRƯỜNG HỢP TÌM KIẾM với KHÁC.

CASE được tìm kiếm trong SQL Server

Sự khác biệt giữa phương pháp thực hiện: TRƯỜNG HỢP ĐƠN GIẢN và TÌM KIẾM.

Hãy xem TRƯỜNG HỢP ĐƠN GIẢN ví dụ dưới đây:

SELECT Tutorial_ID, Tutorial_name,
CASE Tutorial_name
	WHEN 'SQL' THEN 'SQL is developed by IBM'
	WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
	ELSE 'This is NO SQL language.'
END AS Description
FROM Guru99

Ở đây, 'Hướng dẫn_name' là một phần của biểu thức CASE trong SQL. Sau đó 'Hướng dẫn_name' giá trị được so sánh với mỗi giá trị KHI, tức là 'SQL'… cho đến khi 'Tutorial_name' khớp với giá trị WHEN.

Ngược lại, TRƯỜNG HỢP TÌM KIẾM ví dụ không có Biểu thức CASE:

SELECT Tutorial_ID, Tutorial_name,
CASE 
 	WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM'
	WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
END AS Description
FROM Guru99

Ở đây, mỗi Câu lệnh KHI có của nó Biểu thức Boolean có điều kiện. Mỗi trang web biểu thức Boolean tức là Tutorial_name = 'SQL',… được đánh giá cho ĐÚNG SAI cho đến khi Boolean đầu tiên biểu thức mà đánh giá để TRUE.

Sự khác biệt giữa trường hợp đơn giản và tìm kiếm

Trường hợp đơn giản Trường hợp được tìm kiếm
Từ khóa CASE được theo sau bởi CASE_Expression và trước câu lệnh WHEN.

Ví dụ:
TRƯỜNG HỢP
KHI Giá trị_1 THÌ Câu lệnh_1…

Từ khóa case được theo sau bởi câu lệnh WHEN và không có biểu thức nào giữa CASE và WHEN.

Ví dụ:
TRƯỜNG HỢP KHI SAU ĐÓ Tuyên bố_1…

Trong trường hợp đơn giản, VALUE tồn tại cho mỗi câu lệnh WHEN. Giá trị này: Giá trị_1, Giá trị_2… Được so sánh tuần tự với CASE_Expression đơn lẻ. Kết quả được đánh giá theo điều kiện TRUE/FALSE cho mỗi Câu lệnh WHEN.

Ví dụ:
TRƯỜNG HỢP
KHI Giá trị_1 THÌ Câu lệnh_1…
KHI Giá trị_2 THÌ Câu lệnh_2…

Trong Trường hợp được Tìm kiếm, Boolean_Expression tồn tại cho mỗi câu lệnh WHEN. Boolean_Expressions: Boolean_Expression_1, Boolean_Expression_2,… này đánh giá điều kiện TRUE/FALSE cho mỗi Câu lệnh WHEN.

Ví dụ:
TRƯỜNG HỢP
KHI SAU ĐÓ Tuyên bố_1…
KHI SAU ĐÓ Tuyên bố_2…

Trường hợp đơn giản chỉ hỗ trợ kiểm tra đẳng thức. Tức là liệu CASE_Expression = VALUE_1, VALUE_2…

Ví dụ:
TRƯỜNG HỢP KHI Giá trị_1 THÌ Câu lệnh_1…Trong ví dụ trên, thao tác duy nhất được hệ thống thực hiện là kiểm tra xem Case_Expression = Value_1

Với Boolean_Expression_N, Trường hợp tìm kiếm hỗ trợ mọi thao tác dẫn đến giá trị Boolean. Nó bao gồm toán tử bằng và không bằng.

Ví dụ:
TRƯỜNG HỢP KHI THEN Statement_1… Trong ví dụ trên, Boolean_Expression_1 có thể chứa cả toán tử 'bằng' và 'không bằng' như A = B, A != B.

CASE lồng nhau: CASE trong IF ELSE

Chúng ta có thể sử dụng TRƯỜNG HỢP bên trong NẾU ELSE. Dưới đây là ví dụ mã MS-SQL

DECLARE @Flight_Ticket int;
SET @Flight_Ticket = 190;
IF @Flight_Ticket > 400
   PRINT 'Visit Nearby Tourist Location';
ELSE 
BEGIN
    SELECT
	CASE 
	WHEN @Flight_Ticket BETWEEN 0 AND 100 THEN 'Visit Los Angeles'
	WHEN @Flight_Ticket BETWEEN 101 AND 200 THEN 'Visit New York'
	WHEN @Flight_Ticket BETWEEN 201 AND 400 THEN 'Visit Europe'
	END AS Location	
END

Trong ví dụ trên CASE được lồng bên trong câu lệnh IF…ELSE:

Đầu tiên, Câu lệnh IF sẽ thực thi và nếu Điều kiện Trường hợp trong Máy chủ SQL là Sai thì câu lệnh ELSE sẽ được thực thi.

Else chứa Câu lệnh CASE lồng nhau trong SQL bên trong nó. Tùy thuộc vào giá trị Vé máy bay, một trong những kết quả sau sẽ được hiển thị:

  • Hệ thống sẽ in 'Tham quan địa điểm du lịch lân cận' nếu vé máy bay > 400 USD
  • Hệ thống sẽ in 'Visit Los Angeles' nếu vé máy bay GIỮA $0 VÀ $100
  • Hệ thống sẽ in 'Visit New York' nếu vé máy bay GIỮA $101 VÀ $200
  • Hệ thống sẽ in 'Visit Europe' nếu vé máy bay GIỮA $201 VÀ $400

CASE lồng nhau trong SQL Server

CASE lồng nhau: CASE bên trong CASE

Chúng ta có thể sử dụng CASE bên trong CASE trong SQL. Dưới đây là ví dụ mã MS-SQL

DECLARE @Flight_Ticket int;
SET @Flight_Ticket = 250;
SELECT
CASE 
WHEN @Flight_Ticket >= 400 THEN 'Visit Nearby Tourist Location.'
WHEN @Flight_Ticket < 400 THEN 
    	CASE 
		WHEN @Flight_Ticket BETWEEN 0 AND 100 THEN 'Visit Los Angeles'
		WHEN @Flight_Ticket BETWEEN 101 AND 200 THEN 'Visit New York'
		WHEN @Flight_Ticket BETWEEN 201 AND 400 THEN 'Visit Europe'
		END	
END AS Location

Trong ví dụ trên CASE được lồng bên trong một câu lệnh CASE khác:

Hệ thống bắt đầu bằng việc thực thi CASE bên ngoài. Nếu Flight_Ticket < $400 thì CASE bên trong sẽ thực thi.

Tùy thuộc vào giá vé máy bay, một trong những kết quả sau sẽ được hiển thị:

  • Hệ thống sẽ in 'Tham quan địa điểm du lịch lân cận' nếu vé máy bay > 400 USD
  • Hệ thống sẽ in 'Visit Los Angeles' nếu vé máy bay GIỮA $0 VÀ $100
  • Hệ thống sẽ in 'Visit New York' nếu vé máy bay GIỮA $101 VÀ $200
  • Hệ thống sẽ in 'Visit Europe' nếu vé máy bay GIỮA $201 VÀ $400

Ví dụ CASE lồng nhau trong SQL Server

TRƯỜNG HỢP với CẬP NHẬT

Giả định: Giả sử chúng ta có bảng là 'Guru99' với hai cột và bốn hàng như hiển thị bên dưới:

TRƯỜNG HỢP với CẬP NHẬT trong SQL Server

Chúng tôi sẽ sử dụng bảng 'Guru99' trong các ví dụ tiếp theo

Chúng ta có thể sử dụng CASE với UPDATE. Dưới đây là mã MS-SQL ví dụ:

UPDATE Guru99
SET Tutorial_Name = 
	(
	CASE
	WHEN Tutorial_Name = 'SQL' THEN 'Structured Query language.'
	WHEN Tutorial_Name = 'PL/SQL' THEN 'Oracle PL/SQL'
	WHEN Tutorial_Name = 'MSSQL' THEN 'Microsoft SQL.'
	WHEN Tutorial_Name = 'Hadoop' THEN 'Apache Hadoop.'
	END
	)

Trong ví dụ trên CASE được sử dụng trong câu lệnh UPDATE.

Tùy thuộc vào Giá trị Tutorial_Name, cột Tutorial_Name sẽ nhận được bản cập nhật với giá trị Tuyên bố THEN.

  • Nếu Tutorial_Name = 'SQL' THÌ cập nhật Tutorial_Name thành 'Ngôn ngữ truy vấn có cấu trúc'
  • Nếu Tutorial_Name = 'PL/SQL' THÌ cập nhật Tutorial_Name thành 'Oracle PL/SQL'
  • Nếu Tutorial_Name = 'MSSQL' THÌ cập nhật Tutorial_Name thành 'Microsoft SQL'
  • Nếu Tutorial_Name = 'Hadoop' THÌ cập nhật Tutorial_Name thành 'Apache Hadoop'

TRƯỜNG HỢP với CẬP NHẬT trong SQL Server

Hãy truy vấn bảng Guru99 để kiểm tra giá trị được cập nhật:

TRƯỜNG HỢP với CẬP NHẬT trong SQL Server

CASE với đơn đặt hàng của

Chúng ta có thể sử dụng CASE với Order By. Dưới đây là mã MS-SQL ví dụ:

Declare @Order Int;
Set @Order = 1
Select * from Guru99 order by 
CASE 
	WHEN @Order = 1 THEN Tutorial_ID
	WHEN @Order = 2 THEN Tutorial_Name
	END
DESC

Ở đây CASE được sử dụng với Order By.

@Order được đặt thành 1 và là lần đầu tiên KHI biểu thức Boolean được đánh giá là TRUE, Tutorial_ID được chọn cho Thứ tự theo Điều kiện

CASE với thứ tự theo thứ tự trong SQL Server

Sự thật thú vị!

  • CASE có thể được lồng trong một CASE khác cũng như trong một câu lệnh IF…ELSE khác.
  • Ngoài SELECT, CASE có thể được sử dụng với một lệnh khác SQL mệnh đề như UPDATE, ORDER BY.

Tổng kết

  • Trong MS SQL có 2 loại CASE: Simple CASE và Searched CASE
  • ELSE là tùy chọn trong câu lệnh CASE.