Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Biểu thức SQL Server CASE

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 SET và trong các mệnh đề như IN , WHERE , ĐẶT HÀNG THEO , GROUP BY 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ào Bữ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ào Bữ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ữa CASE câu lệnh và CASE , về cơ bản giống với CASE biểu thức.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để tôi có thể chèn 10 triệu bản ghi trong thời gian ngắn nhất có thể?

  2. Làm cách nào để loại trừ Ngày cuối tuần trong truy vấn SQL Server?

  3. SQL Server 2016 - Giới thiệu về Cơ sở dữ liệu Stretch

  4. Chuyển đổi tên tháng thành số tháng trong SQL Server

  5. Không thể thu nhỏ cơ sở dữ liệu ‘chỉ đọc’ | Thu hẹp nhật ký giao dịch khi sử dụng nhóm AlwaysOn Av sẵn sàng