SQL là một ngôn ngữ khai báo. nó không cung cấp khả năng kiểm soát luồng chương trình như
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
31 đối với các chương trình bắt buộc. Tuy nhiên, SQL có một cái gì đó tương tự. biểu thức CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0. Là một biểu thức—chứ không phải là một cấu trúc điều khiển—có nghĩa là CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0 thay đổi kết quả của các công thức [biểu thức] dựa trên các điều kiện. Cách sử dụng của nó tương tự như toán tử bậc ba CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
2 trong các ngôn ngữ lập trình kháccú pháp
Cú pháp của biểu thức
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0 rất linh hoạt và cho phép một số từ viết tắt. Ví dụ sau đây cho thấy cú pháp ở dạng chung nhất—cái gọi là trường hợp tìm kiếm. Các biến thể khác là chữ viết tắt cũng có thể được viết là trường hợp tìm kiếm. Hơn nữa, trường hợp tìm kiếm hoạt động trong hầu hết các cơ sở dữ liệu SQL. Từ quan điểm đó, người ta có thể nói rằng trường hợp được tìm kiếm là cú pháp CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0 duy nhất bạn thực sự cần nhớCASE WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
Lưu ý rằng
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
5 là một điều kiện giống như điều kiện trong mệnh đề CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
6—ví dụ. CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
7. Do đó, trường hợp tìm kiếm tên. CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
8 là một biểu thức SQL tùy ý. nó có thể là một biểu thức đơn giản như một tên hằng hoặc tên cột, hoặc cũng có thể là một biểu thức SQL phức tạp chứa các truy vấn con và tất nhiên là các biểu thức CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0 lồng nhauMột biểu thức
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0 có thể chứa một số cặp CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
21-CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
22. Điều này cho phép nhiều điều kiện ngay cả khi không lồng vào nhau—không giống như toán tử CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
2 trong các ngôn ngữ lập trình khác. Mặt khác, việc lồng cung cấp quyền ưu tiên vốn có giữa các điều kiện. Biểu thức CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0 phẳng không có quyền ưu tiên cố hữu như vậy. Để thu hẹp khoảng cách đó, SQL sử dụng thứ tự xuất hiện các điều kiện trong biểu thức CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0 để xác định mức độ ưu tiên của chúng. 0 Nói một cách đơn giản. CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0 biểu thức ước lượng cho CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
8 của giá trị đúng đầu tiên của CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
5Trước khi kết thúc biểu thức
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0 với CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
10, mệnh đề tùy chọn CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
11 có thể được sử dụng. CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
8 của CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
11 được sử dụng nếu không có CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
5 nào đúng. 1 Nếu CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
11 bị bỏ qua, CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
16 là ẩn. 2Tiêu chuẩn SQL không chỉ định cách xử lý biểu thức
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0—nó chỉ xác định kết quả. 3 Trên thực tế, có những sản phẩm đôi khi xử lý mệnh đề CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
22 ngay cả trước mệnh đề CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
21 tương ứng [đọc lại. CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
22 trước CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
21]. Tất nhiên, những sản phẩm này cuối cùng cũng mang lại kết quả phù hợp—họ chỉ loại bỏ những sản phẩm được đánh giá không cần thiết. Cuối cùng, đây là kết quả của bản chất khai báo của SQL. cơ sở dữ liệu—chứ không phải lập trình viên—quyết định làm thế nào để có được kết quả chính xác. Bạn sẽ tìm hiểu thêm về điều này trong Tiện ích mở rộng độc quyền. Quy trình đánh giá tài liệuMẹo
Không sử dụng các hàm không xác định hoặc các hàm thay đổi dữ liệu trong biểu thức
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0. Quá trình đánh giá không xác định có thể có tác dụng phụ không thể đoán trướcMẫu đơn giản
Để tránh lặp đi lặp lại một toán hạng được sử dụng trong tất cả các mệnh đề
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
21, tiêu chuẩn SQL đưa ra cái gọi là trường hợp đơn giảnCASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
Trường hợp đơn giản chia
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
5 thành hai phần. toán hạng chung [e. g. , tên cột] được đặt ngay sau từ khóa CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0. Mặt khác của sự so sánh vẫn còn trong mệnh đề CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
21. Toán tử so sánh bằng [______397] được ngụ ý. 4Tiêu chuẩn xác định trường hợp đơn giản là sự chuyển đổi sang trường hợp được tìm kiếm—các quy tắc được mô tả ở trên vẫn hợp lệ
thận trọng
Bạn không thể sử dụng trường hợp đơn giản để kiểm tra
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
98 vì nó luôn sử dụng toán tử bằng [CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
97]. Đó là vì điều kiện CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
20 không đúng5—do đó, mệnh đề CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
21 không bao giờ được áp dụng. Nếu CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
22 là CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
98 thì áp dụng mệnh đề CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
11Từ viết tắt để đối phó với CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
98
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
SQL cung cấp hai chữ viết tắt
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0 để đối phó với CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
98. CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
28 và CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
29. Cả hai đều được sử dụng giống như các hàm và không sử dụng các từ khóa CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0, CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
21, CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
22, CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
11 và CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
10CASE WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
75 trả về tham số not-CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
98 đầu tiên [hoặc CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
98, nếu tất cả các tham số là CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
98]. Số lượng tham số không giới hạn. Tiêu chuẩn định nghĩa CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
28 là phép biến đổi thành biểu thức CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0. Do đó các biểu thức sau là tương đươngCASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
2____21CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
51 yêu cầu hai tham số và thường trả về giá trị của tham số đầu tiên. Chỉ khi cả hai giá trị đều bằng nhau [CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
97], thì CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
98 mới được trả về. CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
51 cũng được định nghĩa là phép biến đổi thành CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0 và thường được sử dụng để ngăn lỗi chia cho số 0CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
9CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
2Thay mặt tôi
Tôi kiếm sống từ việc đào tạo SQL, điều chỉnh và tư vấn SQL và cuốn sách của tôi “Giải thích về hiệu suất SQL”. Tìm hiểu thêm tại https. // winand. tại/
Hình thức hầu như không được hỗ trợ
Tất cả các dạng
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0 được hiển thị ở trên đều được giới thiệu với SQL-92 trung gian và thực tế hoạt động trong tất cả các cơ sở dữ liệu SQL. SQL. 2003 đã giới thiệu thêm hai chữ viết tắt mở rộng trường hợp đơn giản. Cả hai đều là tính năng tùy chọn và chưa được hỗ trợ rộng rãiCái gọi là trường hợp mở rộng chấp nhận một toán tử so sánh ngay sau
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
21 và do đó loại bỏ giới hạn rằng trường hợp đơn giản luôn sử dụng phép so sánh bằng [_______397]. Ví dụ sau sử dụng toán tử nhỏ hơn [CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
59] để ánh xạ các giá trị thành các khoảng. Nó cũng dựa trên mức độ ưu tiên của mệnh đề CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
21. điều kiện đúng đầu tiên thắngCASE WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
7Phần bổ sung thứ hai được giới thiệu bởi SQL. 2003 cho phép các danh sách được phân tách bằng dấu phẩy trong mệnh đề
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
21CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
5Xác định loại kết quả
Loại kết quả của một biểu thức
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0 được xác định bởi tất cả các biểu thức CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
8 chung. 6 Tiêu chuẩn SQL xác định các quy tắc nghiêm ngặt về cách tìm loại kết quả khi trộn các loại dữ liệu có liên quan7—ví dụ: nếu một mệnh đề CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
22 có loại CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
35 trong khi một mệnh đề khác có loại CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
36. Các quy tắc tiêu chuẩn xác định cho các loại liên quan về cơ bản là lẽ thường, tôi. e. , loại kết quả của biểu thức CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0 là loại ngắn nhất có thể chứa tất cả các giá trị kết quả có thể. 8 Trong ví dụ, loại kết quả là CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
36Như thường lệ,
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
98 là đặc biệt. chữ CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
98—như trong CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
16—không có loại đã biết. Do đó, nó bị bỏ qua khi xác định loại kết quả của biểu thức CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0. 9 Thực tế, CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
98 điều chỉnh thành loại kết quả của biểu thức CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0 tổng thểCác loại số gần đúng [
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
315, CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
316 hoặc CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
317] cần được chăm sóc đặc biệt. nếu một CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
8 có một kiểu số gần đúng, thì tiêu chuẩn SQL yêu cầu kiểu kết quả của biểu thức CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0 cũng phải là một kiểu số gần đúng—cái nào được xác định triển khai. 10 Tương tự như vậy, việc triển khai được xác định chuyển đổi kiểu ngầm định nào được thực hiện. 11 Do đó, một số sản phẩm cho phép trộn các loại dữ liệu không liên quan trong CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0 biểu thức mà không cần chuyển đổi rõ ràngMẹo
Tránh trộn lẫn các loại trong mệnh đề
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
22. Nếu cần, hãy sử dụng CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
02 để chuyển đổi chúng thành loại được yêu cầu một cách rõ ràngTrường hợp sử dụng
Các bài viết sau đây mô tả các trường hợp sử dụng phổ biến của
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0Pivot – Hàng tới Cột –
0 trong các hàm tổng hợpCASE WHEN THEN [WHEN THEN ...] [ELSE ] END
Ngăn phép chia cho 0 –
05CASE WHEN THEN [WHEN THEN ...] [ELSE ] END
Hơn để làm theo. Đăng ký nhận bản tin
khả năng tương thích
Biểu thức
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0 được giới thiệu với SQL-92 trung cấp. SQL. 1999 kết hợp CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0 làm tính năng F261 vào Core SQL để nó trở thành bắt buộc. Ngày nay hầu như tất cả các cơ sở dữ liệu SQL đều hỗ trợ tính năng nàySQL. 2003 đã thêm hai tính năng tùy chọn hầu như không được hỗ trợ “Biểu thức CASE mở rộng” [F262] và “Các vị từ được phân tách bằng dấu phẩy trong biểu thức CASE đơn giản” [F263]
Tiện ích mở rộng độc quyền
Quy trình đánh giá tài liệu
Tiêu chuẩn SQL không xác định quy trình cách giải quyết biểu thức
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0. Đặc biệt, tiêu chuẩn không bắt buộc phải kiểm tra các điều kiện theo thứ tự xuất hiện của chúng trong biểu thức CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0. Miễn là việc triển khai cuối cùng mang lại kết quả phù hợp, mọi thứ đều được cho phépMặc dù các quy trình đánh giá khác nhau phải tạo ra cùng một kết quả, nhưng các quy trình khác nhau có thể gây ra các tác dụng phụ khác nhau. Ví dụ: khi sử dụng các hàm thay đổi dữ liệu, chúng có thể được gọi ngay cả khi không thực sự cần thiết—tuy nhiên, bạn có thể thấy tác dụng phụ của chúng. dữ liệu đã thay đổi. Tương tự như vậy, việc có xảy ra lỗi thời gian chạy hay không có thể phụ thuộc vào quy trình đánh giá. nếu lỗi nằm trong một phần của biểu thức
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0 thì không nhất thiết phải được đánh giá, nó có thể được kích hoạt hoặc không trong quá trình đánh giá. Cuối cùng, thời gian đánh giá cũng là một tác dụng phụ phụ thuộc vào quá trình đánh giáXem xét tác dụng phụ cuối cùng—hiệu suất—quy trình đánh giá rõ ràng là kiểm tra các mệnh đề
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
21 theo thứ tự cho đến khi tìm thấy điều kiện đúng đầu tiên. Tất nhiên, cũng hợp lý khi chỉ đánh giá một kết quả—mệnh đề CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
22 tương ứng hoặc mệnh đề CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
11. Một số sản phẩm thậm chí còn ghi lại quy trình đánh giá này. Tuy nhiên, có những trường hợp có thể dẫn đến tác dụng phụ đáng ngạc nhiênMột ví dụ phổ biến có thể gây ra tác dụng phụ đáng ngạc nhiên là điều này. một số sản phẩm đánh giá các biểu thức không đổi sớm—i. e. , trong giai đoạn chuẩn bị trước khi thực hiện. Điều này rất giống với trình biên dịch giải quyết các biểu thức hằng số [e. g. ,
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
14] trong quá trình biên dịch—thay vì sau đó tạo mã tính toán kết quả trong thời gian chạy. Nếu tối ưu hóa này ảnh hưởng đến một phần của biểu thức CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0, thứ tự đánh giá sẽ bị xáo trộnDo đó, ví dụ sau có thể dẫn đến lỗi chia cho 0 ngay cả khi điều kiện
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
16 không bao giờ đúng. Ngay cả khi bảng CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
17 trống, lỗi vẫn có thể xảy ra, nếu biểu thức hằng số CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
18 được đánh giá trong giai đoạn chuẩn bịCASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
3CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
19, CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
20, CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
21, không có giá trị, …
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
Các hàm
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
19 [Oracle, Db2], CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
21 [Google BigQuery, MySQL], CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
24 [SQL Server] gần tương ứng với CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
28 ngoại trừ việc chúng bị giới hạn ở hai đối sốMáy chủ SQL CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
24 có thể mất dữ liệu
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
Trong SQL Server, kiểu trả về của hàm
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
24 luôn là kiểu của đối số đầu tiên. Ví dụ: nếu đối số thứ hai có độ chính xác cao hơn, dữ liệu quan trọng có thể bị mất. Xem “Coalesce and isnull in Microsoft SQL Server – the gotchas. ”CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
28 [Oracle, MySQL]
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
Hàm
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
28 chứng minh rằng các hàm độc quyền có thể thực hiện những việc hoàn toàn khác trong các sản phẩm khác nhau. Trong MySQL, CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
28 là một hàm mã hóa [không dùng nữa]. Trong Cơ sở dữ liệu Oracle, nó là một dạng ngắn độc quyền của CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
31 [Google BigQuery, MySQL]
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
Hàm
CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
31 là dạng rút gọn độc quyền của biểu thức CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
0 được tìm kiếm với một mệnh đề CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
21—rất giống với toán tử bậc ba CASE
WHEN THEN
[WHEN THEN
...]
[ELSE ]
END
2