Trong SQL Server, T-SQL CASE
biểu thức là một biểu thức vô hướng trả về một giá trị dựa trên logic có điều kiện. Nó đánh giá một danh sách các điều kiện và trả về một giá trị, dựa trên kết quả của các điều kiện đó ..
Theo một số cách, SQL Server CASE
biểu thức tương tự như IF ... ELSE
. Tuy nhiên, CASE
cho phép bạn kiểm tra nhiều điều kiện, trong khi IF ... ELSE
không.
Ngoài ra, trong SQL Server, IF ... ELSE
là một từ khóa ngôn ngữ kiểm soát luồng, trong khi CASE
không phải. CASE
không thể sử dụng biểu thức để kiểm soát luồng thực thi các câu lệnh T-SQL, các khối câu lệnh, các hàm do người dùng định nghĩa và các thủ tục được lưu trữ.
2 Dạng Biểu hiện CASE
Có hai dạng CASE
biểu thức trong SQL Server:
-
CASE
đơn giản biểu hiện -
CASE
đã tìm kiếm biểu hiện
Những điều này được giải thích bằng các ví dụ bên dưới.
Dạng 1 - Biểu thức TRƯỜNG HỢP Đơn giản
CASE
đơn giản biểu thức so sánh một biểu thức với một tập hợp các biểu thức đơn giản để xác định kết quả.
Dưới đây là một ví dụ cơ bản để chứng minh cách một CASE
biểu thức hoạt động trong SQL Server.
DECLARE @stock_ticker varchar (4) ='V'; SELECT Company =CASE @stock_ticker WHEN 'AAPL' THEN 'Apple' WHEN 'FB' THEN 'Facebook' WHEN 'V' THEN 'Visa' ELSE ' Không có trong danh mục đầu tư 'END
Kết quả:
+ ----------- + | Công ty || ----------- || Visa | + ----------- +
Trong ví dụ này, CASE
của tôi biểu thức là một phần của SELECT
tuyên bố. Nó kiểm tra ba điều kiện và có ELSE
để phục vụ cho bất kỳ thứ gì không nằm trong ba điều kiện.
Trong trường hợp này, mã chứng khoán V
khớp với WHEN
thứ ba biểu thức và biểu thức được cung cấp bởi THEN
được trả lại.
Để rõ ràng, CASE
thực tế biểu thức là phần này:
CASE @stock_ticker KHI 'AAPL' THÌ 'Apple' KHI 'FB' THEN 'Facebook' KHI 'MA' THEN 'Mastercard' KHI 'V' THEN 'Visa' ELSE 'Không có trong danh mục đầu tư' HẾT
Cái gì CASE
nghĩa là, nó kiểm tra giá trị của mỗi WHEN
biểu thức so với biểu thức đầu vào. Trong ví dụ của tôi, @stock_ticker
biến là biểu thức đầu vào. Do đó, nó đang kiểm tra giá trị của mỗi WHEN
biểu thức chống lại @stock_ticker
biến.
Khi / nếu nó tìm thấy một kết quả phù hợp, thì nó sẽ trả về biểu thức được cung cấp bởi THEN
.
Ví dụ của tôi sử dụng ba WHEN
, nhưng có thể nhiều hơn và có thể ít hơn, tùy thuộc vào yêu cầu của tôi.
Dạng 2 - Biểu thức CASE đã Tìm kiếm
CASE
đã tìm kiếm biểu thức đánh giá một tập hợp các biểu thức Boolean để xác định kết quả.
Đây là ví dụ về CASE
được tìm kiếm biểu thức.
DECLARE @price int =1500; CHỌN Khả năng chi trả =TRƯỜNG HỢP KHI @ giá <100 THÌ 'Rẻ' KHI @ giá> =100 VÀ @ giá <500 THÌ 'Giá cả phải chăng' ELSE 'Đắt' HẾT
Kết quả:
+ ----------------- + | Giá cả phải chăng || ----------------- || Đắt | + ----------------- +
CASE
được tìm kiếm biểu thức không có biểu thức đầu vào như CASE
đơn giản biểu thức.
Bạn sẽ nhớ lại điều đó trong CASE
đơn giản của chúng tôi biểu thức, nó bắt đầu bằng CASE
@stock_ticker
và do đó chúng tôi biết rằng WHEN
tất cả các biểu thức đều được đánh giá dựa trên giá trị của @stock_ticker
.
Với CASE
đã tìm kiếm , chúng tôi không cung cấp một biểu thức đầu vào ở đầu như vậy. Thay vào đó, mỗi WHEN
biểu thức bao gồm một biểu thức Boolean được đánh giá dựa vào đó.
Một ví dụ về cơ sở dữ liệu
Dưới đây là một ví dụ minh họa cách CASE
biểu thức có thể được sử dụng trong một truy vấn cơ sở dữ liệu.
SỬ DỤNG WideWorldImporters; CHỌN CityName AS [City], LatestRecordedPopulation AS [Dân số], Size =CASE KHI Mới nhấtRecordedPopulation <2000000 THÌ 'Thành phố nhỏ' KHI Mới nhấtRecordedPopulation> =2000000 VÀ Mới nhấtRecordedPopulation <3000000 THÌ 'Thành phố lớn' ELSE ' Thành phố Thực sự Lớn 'KẾT THÚC TỪ Ứng dụng.
Kết quả:
+ -------------- + -------------- + ---------------- - + | Thành phố | Dân số | Kích thước || -------------- + -------------- + ----------------- || Brooklyn | 2565635 | Thành Phố Lớn || Chicago | 2695598 | Thành Phố Lớn || Dallas | 1197816 | Thành Phố Nhỏ || Houston | 2099451 | Thành Phố Lớn || Los Angeles | 3792621 | Thành Phố Thực Sự Lớn || Manhattan | 1619090 | Thành Phố Nhỏ || New York | 8175133 | Thành Phố Thực Sự Lớn || Philadelphia | 1526006 | Thành Phố Nhỏ || Phượng hoàng | 1445632 | Thành Phố Nhỏ || Nữ hoàng | 2272771 | Thành Phố Lớn || San Antonio | 1327407 | Thành Phố Nhỏ || San Diego | 1307402 | Thành Phố Nhỏ || Bronx | 1408473 | Thành phố nhỏ | + -------------- + -------------- + ---------------- - +
Ví dụ này sử dụng CASE
được tìm kiếm biểu thức để đánh giá kết quả từ LatestRecordedPopulation
cột của Application.Cities
bàn.
Loại dữ liệu
Trong SQL Server, kiểu dữ liệu của biểu thức đầu vào và WHEN
các biểu thức phải giống nhau hoặc phải là một chuyển đổi ngầm định.
Đây là những gì sẽ xảy ra nếu không:
DECLARE @stock_ticker varchar (4) ='V'; SELECT Company =CASE @stock_ticker KHI 1 THÌ 'Apple' KHI 2 THÌ 'Facebook' KHI 3 THÌ 'Mastercard' KHI 4 THÌ 'Visa' ELSE ' Không có trong danh mục đầu tư 'END
Kết quả:
Msg 245, Mức 16, Trạng thái 1, Dòng 3 Chuyển đổi không thành công khi chuyển đổi giá trị varchar 'V' thành kiểu dữ liệu int.
Thứ tự đánh giá
T-SQL CASE
biểu thức đánh giá các điều kiện của nó một cách tuần tự và dừng với điều kiện đầu tiên có điều kiện được thỏa mãn.
Để chứng minh điều này, hãy sử dụng nhiều WHEN
các biểu thức có cùng giá trị:
DECLARE @stock_ticker varchar (4) ='V'; SELECT Company =CASE @stock_ticker WHEN 'V' THEN 'Visa 1' WHEN 'V' THEN 'Visa 2' WHEN 'V' THEN 'Visa 3 'ELSE' Không có trong danh mục đầu tư 'HẾT
Kết quả:
+ ----------- + | Công ty || ----------- || Visa 1 | + ----------- +
Trong trường hợp này, nó dừng lại ở WHEN
đầu tiên biểu thức.
Đôi khi có thể có trường hợp trong đó một biểu thức được đánh giá trước CASE
biểu thức nhận kết quả của biểu thức làm đầu vào của nó. Trong những trường hợp như vậy, bạn có thể gặp lỗi. Điều này có thể xảy ra nếu bạn bao gồm một biểu thức tổng hợp dưới dạng WHEN
biểu thức.
Vì lý do này, Microsoft khuyên rằng:
Bạn chỉ nên phụ thuộc vào thứ tự đánh giá các điều kiện WHEN đối với biểu thức vô hướng (bao gồm các truy vấn phụ không tương quan trả về đại lượng vô hướng), chứ không phải đối với biểu thức tổng hợp.
ELSE là Tùy chọn
ELSE
đối số là tùy chọn. Do đó, chúng tôi có thể viết lại ví dụ về "khả năng chi trả" của mình như sau:
DECLARE @price int =1500; CHỌN Khả năng chi trả =TRƯỜNG HỢP KHI @ giá <100 THÌ 'Rẻ' KHI @ giá> =100 VÀ @ giá <500 THÌ 'Giá cả phải chăng' KHI @ giá> =500 THÌ 'Đắt 'HẾT
Kết quả:
+ ----------------- + | Giá cả phải chăng || ----------------- || Đắt | + ----------------- +
Mặc dù vậy, hãy lưu ý rằng bạn có thể kết thúc bằng NULL
nếu bạn bỏ qua ELSE
lý lẽ.
Ví dụ sau cho kết quả là NULL
:
DECLARE @price int =1500; CHỌN Khả năng chi trả =TRƯỜNG HỢP KHI @ giá <100 THÌ 'Rẻ' KHI @ giá> =100 VÀ @ giá <500 THÌ 'Giá cả phải chăng' KHI @ giá> =500 VÀ @ giá <1000 SAU ĐÓ 'Đắt' HẾT
Kết quả:
+ ----------------- + | Giá cả phải chăng || ----------------- || NULL | + ----------------- +
Trong những trường hợp như vậy, chúng tôi luôn có thể thêm ELSE
đối số, chỉ trong trường hợp (xin lỗi về cách chơi chữ!):
DECLARE @price int =1500; CHỌN Khả năng chi trả =TRƯỜNG HỢP KHI @ giá <100 THÌ 'Rẻ' KHI @ giá> =100 VÀ @ giá <500 THÌ 'Giá cả phải chăng' KHI @ giá> =500 VÀ @ giá <1000 THÌ 'Đắt' ELSE 'Không xác định' HẾT
Kết quả:
+ ----------------- + | Giá cả phải chăng || ----------------- || Không xác định | + ----------------- +
Phải thừa nhận rằng, ví dụ này có lẽ hơi phức tạp. Rốt cuộc, không cần phải giới hạn "đắt tiền". Nếu một thứ gì đó đắt dưới $ 1000, thì nó cũng đắt nếu nó trên $ 1000.
Nhưng vấn đề là, bạn có thể sử dụng ELSE
để nắm bắt bất kỳ thứ gì không nằm trong WHEN
/ s.
Biểu thức CASE lồng nhau
Bạn có thể lồng CASE
biểu thức nếu được yêu cầu.
DECLARE @price int, @on_sale bit; SET @price =1500; SET @on_sale =1; SELECT Affordability =CASE WHEN @price <100 THÌ 'Rẻ' KHI @price> =100 THÌ CASE @on_sale KHI 0 THÌ 'Đắt (nhưng nó hiện không được giảm giá)' KHI 1 THÌ 'Đắt (và nó đã được giảm giá!)' HẾT END
Kết quả:
+ --------------------------------------- + | Giá cả phải chăng || --------------------------------------- || Đắt (và nó đã được giảm giá!) | + --------------------------------------- +
Tuy nhiên, điều quan trọng cần lưu ý là chỉ cho phép 10 cấp độ lồng nhau cho CASE
biểu thức trong SQL Server. Nếu bạn cố gắng lồng nhiều hơn 10 cấp, thì bạn sẽ gặp lỗi.
CASE trong mệnh đề ORDER BY
Như đã đề cập, T-SQL CASE
biểu thức có thể được sử dụng trong bất kỳ câu lệnh hoặc mệnh đề nào cho phép một biểu thức hợp lệ. Do đó, bạn có thể sử dụng nó trong các câu lệnh như SELECT
, CẬP NHẬT
, XÓA
và SET
và trong các mệnh đề như IN
, WHERE
, ĐẶT HÀNG THEO
, GROUP BY
và HAVING
.
Sử dụng CASE
biểu thức trong ORDER BY
của một câu lệnh mệnh đề có thể hữu ích khi bạn muốn tạo một ngoại lệ đặc biệt cho các giá trị nhất định khi sắp xếp các kết quả của bạn.
Giả sử chúng ta chạy truy vấn sau đối với một bảng chứa các thể loại nhạc.
CHỌN Thể loại TỪ MusicGenresORDER THEO Thể loại ASC;
Kết quả:
+ --------- + | Thể loại || --------- || Nhạc Blues || Đất nước || Hip Hop || Nhạc Jazz || Kim loại || Khác || Bốp || Rap || Đá | + --------- +
Ở đây, chúng tôi sắp xếp các kết quả theo Thể loại
cột, theo thứ tự tăng dần.
Điều này là tốt, ngoại trừ một điều. Thể loại có tên Khác . Sẽ không tốt nếu chúng ta có thể di chuyển Khác xuống dưới cùng?
Chúng ta có thể đạt được điều này với CASE
bằng cách sử dụng truy vấn trên và sửa đổi nó như sau.
CHỌN Thể loạiFROM MusicGenresORDER THEO TRƯỜNG HỢP Thể loại KHI 'Khác' THÌ 1 ELSE 0 KẾT THÚC ASC, Thể loại ASC;
Kết quả:
+ --------- + | Thể loại || --------- || Nhạc Blues || Đất nước || Hip Hop || Nhạc Jazz || Kim loại || Bốp || Rap || Đá || Khác | + --------- +
CASE trong Tuyên bố CẬP NHẬT
Dưới đây là một ví dụ về việc sử dụng CASE
biểu thức trong UPDATE
tuyên bố.
Giả sử chúng ta có bảng sau:
+ --------- + ----------- + ----------- + ---------- + | DogId | DogName | GoodDog | Bữa tối || --------- + ----------- + ----------- + ---------- || 1 | Tìm nạp | 1 | NULL || 2 | Bông xù | 0 | NULL || 3 | Wag | 0 | NULL || 1001 | Brian | 1 | NULL || 1002 | Rambo | 0 | NULL || 1003 | BamBam | 1 | NULL | + --------- + ----------- + ----------- + ---------- +Gần đây chúng tôi đã thêm
Bữa tối
và nó vẫn làNULL
, đang đợi các giá trị được chèn vào.Nhưng các giá trị được chèn sẽ phụ thuộc vào giá trị của
GoodDog
cột.Chúng tôi có thể sử dụng
CASE
trong một tình huống như vậy.UPDATE Dogs SET Dinner =CASE GoodDog WHEN 1 THEN 'Sunday Roast' ELSE 'Airline food' ENDSELECT * FROM Dogs;
Kết quả:
+ --------- + ----------- + ----------- + ------------ - + | DogId | DogName | GoodDog | Bữa tối || --------- + ----------- + ----------- + ------------- - || 1 | Tìm nạp | 1 | Món Nướng Chủ Nhật || 2 | Bông xù | 0 | Đồ ăn hàng không || 3 | Wag | 0 | Đồ ăn hàng không || 1001 | Brian | 1 | Món Nướng Chủ Nhật || 1002 | Rambo | 0 | Đồ ăn hàng không || 1003 | BamBam | 1 | Món nướng chủ nhật | + --------- + ----------- + ----------- + ------------ - +CASE trong câu lệnh INSERT
Chúng ta có thể lấy bảng từ ví dụ trên và chèn một giá trị mới.
Và chúng ta lại có thể tận dụng
CASE
biểu thức để chèn giá trị thích hợp vàoBữa tối
cột.DECLARE @DogName nvarchar (60), @GoodDog bit; SET @DogName ='Lazy'; SET @GoodDog =0; INSERT INTO Dogs (DogName, GoodDog, Dinner) GIÁ TRỊ (@DogName, @GoodDog, CASE @GoodDog KHI 1 THÌ 'Sunday Roast' ELSE 'Airline food' END); CHỌN * TỪ Chó;
Kết quả:
+ --------- + ----------- + ----------- + ------------ - + | DogId | DogName | GoodDog | Bữa tối || --------- + ----------- + ----------- + ------------- - || 1 | Tìm nạp | 1 | Món Nướng Chủ Nhật || 2 | Bông xù | 0 | Đồ ăn hàng không || 3 | Wag | 0 | Đồ ăn hàng không || 1001 | Brian | 1 | Món Nướng Chủ Nhật || 1002 | Rambo | 0 | Đồ ăn hàng không || 1003 | BamBam | 1 | Món Nướng Chủ Nhật || 1004 | Lười biếng | 0 | Thức ăn hàng không | + --------- + ----------- + ----------- + ------------ - +Lần này là
CASE
biểu thức đánh giá giá trị của một biến mà chúng tôi vừa đặt, sau đó chèn giá trị thích hợp vàoBữa tối
cột.Nó là một câu lệnh CASE hay một câu biểu thức CASE?
Trong SQL, rất nhiều thứ được gọi là một “câu lệnh” trong khi thực tế, chúng là một thứ gì đó khác. Điều này cũng có vẻ đúng với T-SQL “
CASE
tuyên bố ”.Mặc dù nó thường được gọi là
CASE
, chính xác hơn là gọi nó làCASE
biểu thức . Đây cũng là cách tài liệu của Microsoft đề cập đến nó.Trong SQL Server, thay vì là một câu lệnh,
CASE
có thể được sử dụng trong bất kỳ câu lệnh hoặc mệnh đề nào cho phép một biểu thức hợp lệ. Một biểu thức là sự kết hợp của các ký hiệu và toán tử được đánh giá để có được một giá trị dữ liệu duy nhất.Tuy nhiên, một số DBMS phân biệt giữa
CASE
câu lệnh vàCASE
và có một cú pháp hơi khác nhau cho mỗi. MySQL phân biệt giữaCASE
câu lệnh vàCASE
, về cơ bản giống vớiCASE
biểu thức.