Thí dụ
Trải qua các điều kiện và trả về một giá trị khi điều kiện đầu tiên được đáp ứng:
Chọn orderID, số lượng, trường hợp & nbsp; & nbsp; & nbsp; Khi số lượng> 30 thì "Số lượng lớn hơn 30" & nbsp; & nbsp; & nbsp; Khi số lượng = 30 thì "Số lượng là 30" & nbsp; & nbsp; & nbsp; Khác "Số lượng dưới 30" endFrom orderDetails;
CASE
WHEN Quantity > 30 THEN "The quantity is greater than 30"
WHEN Quantity = 30 THEN "The quantity is 30"
ELSE "The quantity is under 30"
END
FROM OrderDetails;
Hãy tự mình thử »
Định nghĩa và cách sử dụng
Tuyên bố trường hợp trải qua các điều kiện và trả về một giá trị khi điều kiện đầu tiên được đáp ứng [như một câu lệnh if-then-else]. Vì vậy, một khi một điều kiện là đúng, nó sẽ ngừng đọc và trả về kết quả.
Nếu không có điều kiện nào là đúng, nó sẽ trả về giá trị trong mệnh đề khác.
Nếu không có phần khác và không có điều kiện nào là đúng, nó sẽ trả lại null.
Cú pháp
Trường hợp & nbsp; & nbsp; & nbsp; Khi điều kiện1 thì kết quả1 & nbsp; & nbsp; & nbsp; Khi điều kiện2 thì result2 & nbsp; & nbsp; & nbsp; Khi điều kiện sau đó kết quả & nbsp; & nbsp; & nbsp; Kết quả khác;
WHEN condition1 THEN
result1
WHEN condition2 THEN result2
WHEN conditionN THEN resultN
ELSE result
END;
Giá trị tham số
điều kiện1, điều kiện2, ... điều kiện | Yêu cầu. Điều kiện. Chúng được đánh giá theo thứ tự giống như chúng được liệt kê |
Kết quả1, kết quả2, ... kết quả | Yêu cầu. Giá trị để trả lại sau khi một điều kiện là đúng |
Chi tiết kỹ thuật
Từ MySQL 4.0 |
Nhiều ví dụ hơn
SQL sau đây sẽ đặt hàng khách hàng theo thành phố. Tuy nhiên, nếu City là NULL, thì hãy đặt hàng theo quốc gia:
Thí dụ
Chọn Tên tùy chỉnh, Thành phố, CountryFrom Khách hàng theo [Case & NBSP; & NBSP; & NBSP; Khi Thành phố là NULL sau đó là Quốc gia & NBSP; & NBSP; & NBSP; khác CityEnd];
FROM Customers
ORDER BY
[CASE
WHEN City IS NULL THEN Country
ELSE City
END];
Hãy tự mình thử »
Tuyên bố trường hợp MySQL
Câu lệnh CASE
trải qua các điều kiện và trả về một giá trị khi điều kiện đầu tiên được đáp ứng [giống như một câu lệnh if-then-else]. Vì vậy, một khi một điều kiện là đúng, nó sẽ ngừng đọc và trả về kết quả. Nếu không có điều kiện nào là đúng, nó sẽ trả về giá trị trong mệnh đề ELSE
.
Nếu không có phần ELSE
và không có điều kiện nào là đúng, nó sẽ trả về null.
COLTAX TRƯỜNG HỢP
Trường hợp & nbsp; & nbsp; & nbsp; Khi điều kiện1 thì kết quả1 & nbsp; & nbsp; & nbsp; Khi điều kiện2 thì result2 & nbsp; & nbsp; & nbsp; Khi điều kiện sau đó kết quả & nbsp; & nbsp; & nbsp; Kết quả khác;
WHEN condition1
THEN result1
WHEN condition2 THEN result2
WHEN conditionN THEN resultN
ELSE result
END;
Cơ sở dữ liệu demo
Dưới đây là một lựa chọn từ bảng "OrderDetails" trong cơ sở dữ liệu mẫu Northwind:
1 | 10248 | 11 | 12 |
2 | 10248 | 42 | 10 |
3 | 10248 | 72 | 5 |
4 | 10249 | 14 | 9 |
5 | 10249 | 51 | 40 |
Ví dụ trường hợp MySQL
SQL sau đây trải qua các điều kiện và trả về giá trị khi đáp ứng điều kiện đầu tiên:
Thí dụ
Chọn orderID, số lượng, trường hợp & nbsp; & nbsp; & nbsp; Khi số lượng> 30 thì 'số lượng lớn hơn 30' & nbsp; & nbsp; & nbsp; Khi số lượng = 30 thì 'Số lượng là 30' & nbsp; & nbsp; & nbsp; Khác 'số lượng dưới 30'end dưới dạng số lượng orderdetails;
CASE
WHEN Quantity > 30 THEN 'The quantity is greater than 30'
WHEN Quantity = 30 THEN 'The quantity is 30'
ELSE 'The quantity is under 30'
END AS QuantityText
FROM OrderDetails;
Hãy tự mình thử »
SQL sau đây sẽ đặt hàng khách hàng theo thành phố. Tuy nhiên, nếu City là NULL, thì hãy đặt hàng theo quốc gia:
Thí dụ
Chọn orderID, số lượng, trường hợp & nbsp; & nbsp; & nbsp; Khi số lượng> 30 thì 'số lượng lớn hơn 30' & nbsp; & nbsp; & nbsp; Khi số lượng = 30 thì 'Số lượng là 30' & nbsp; & nbsp; & nbsp; Khác 'số lượng dưới 30'end dưới dạng số lượng orderdetails;
FROM Customers
ORDER BY
[CASE
WHEN City IS NULL THEN Country
ELSE City
END];
Hãy tự mình thử »
Chúng ta có thể viết trường hợp trong điều kiện ở đâu không?: in this tutorial, you will learn how to use the MySQL CASE
expression to add if-else logic to queries.
Một cách khác để sử dụng câu lệnh trường hợp là trong mệnh đề WHERE. Ở đó, nó có thể được sử dụng để thay đổi dữ liệu được tìm nạp bởi một truy vấn dựa trên một điều kiện. Trong bối cảnh đó, tuyên bố trường hợp phù hợp lý tưởng với cả các truy vấn tĩnh, cũng như các truy vấn động, chẳng hạn như những câu hỏi mà bạn sẽ tìm thấy bên trong một quy trình được lưu trữ.
Tóm tắt: Trong hướng dẫn này, bạn sẽ tìm hiểu cách sử dụng biểu thức MySQL CASE
để thêm logic if-else vào truy vấn.
Giới thiệu về biểu thức MySQL CASE
Biểu thức MySQL CASE
là cấu trúc luồng điều khiển cho phép bạn thêm logic if-else vào truy vấn. Nói chung, bạn có thể sử dụng biểu thức CASE
ở bất cứ đâu cho phép biểu thức hợp lệ, ví dụ:
3,Code language: SQL [Structured Query Language] [sql]
CASE WHEN expression1 THEN result1 WHEN expression2 THEN result2 … [ELSE else_result] END
4 vàCode language: SQL [Structured Query Language] [sql]
CASE WHEN expression1 THEN result1 WHEN expression2 THEN result2 … [ELSE else_result] END
5.Code language: SQL [Structured Query Language] [sql]
CASE WHEN expression1 THEN result1 WHEN expression2 THEN result2 … [ELSE else_result] END
Biểu thức CASE
có hai dạng: đơn giản CASE
và tìm kiếm CASE
.
Lưu ý rằng MySQL có tuyên bố CASE
mà bạn chỉ có thể sử dụng trong các chương trình được lưu trữ như quy trình lưu trữ, chức năng được lưu trữ, sự kiện và trình kích hoạt, không phải là biểu thức CASE
được đề cập trong hướng dẫn này.
Code language: SQL [Structured Query Language] [sql]
CASE value WHEN value1 THEN result1 WHEN value2 THEN result2 … [ELSE else_result] END
Biểu thức CASE
đơn giản
Sau đây minh họa cú pháp của đơn giản & nbsp; CASE
Biểu thức:
Trong cú pháp này, CASE
phù hợp với giá trị với SELECT
customerName,
COUNT[*] orderCount
FROM
orders
INNER JOIN customers
USING [customerNumber]
GROUP BY customerName
ORDER BY COUNT[*];
Code language: SQL [Structured Query Language] [sql]
4, SELECT
customerName,
COUNT[*] orderCount
FROM
orders
INNER JOIN customers
USING [customerNumber]
GROUP BY customerName
ORDER BY COUNT[*];
Code language: SQL [Structured Query Language] [sql]
5, v.v., cho sự bình đẳng và trả về SELECT
customerName,
COUNT[*] orderCount
FROM
orders
INNER JOIN customers
USING [customerNumber]
GROUP BY customerName
ORDER BY COUNT[*];
Code language: SQL [Structured Query Language] [sql]
6, ________ 27, Điều khoản ELSE
được chỉ định.
SELECT
customerName,
COUNT[*] orderCount
FROM
orders
INNER JOIN customers
USING [customerNumber]
GROUP BY customerName
ORDER BY COUNT[*];
SELECT
customerName,
COUNT[*] orderCount
FROM
orders
INNER JOIN customers
USING [customerNumber]
GROUP BY customerName
ORDER BY COUNT[*];
SELECT
customerName,
COUNT[*] orderCount
FROM
orders
INNER JOIN customers
USING [customerNumber]
GROUP BY customerName
ORDER BY COUNT[*];
CASE
so sánh
8 vớiCode language: SQL [Structured Query Language] [sql]
SELECT customerName, COUNT[*] orderCount FROM orders INNER JOIN customers USING [customerNumber] GROUP BY customerName ORDER BY COUNT[*];
6 trong các mệnh đềCode language: SQL [Structured Query Language] [sql]
WITH cte AS [ SELECT customerName, COUNT[*] orderCount FROM orders INNER JOIN customers USING [customerNumber] GROUP BY customerName ] SELECT customerName, orderCount, CASE orderCount WHEN 1 THEN 'One-time Customer' WHEN 2 THEN 'Repeated Customer' WHEN 3 THEN 'Frequent Customer' ELSE 'Loyal Customer' end customerType FROM cte ORDER BY customerName;
7 cho sự bình đẳng, bạn không thể sử dụng nó vớiCode language: SQL [Structured Query Language] [sql]
WITH cte AS [ SELECT customerName, COUNT[*] orderCount FROM orders INNER JOIN customers USING [customerNumber] GROUP BY customerName ] SELECT customerName, orderCount, CASE orderCount WHEN 1 THEN 'One-time Customer' WHEN 2 THEN 'Repeated Customer' WHEN 3 THEN 'Frequent Customer' ELSE 'Loyal Customer' end customerType FROM cte ORDER BY customerName;
8 vìCode language: SQL [Structured Query Language] [sql]
WITH cte AS [ SELECT customerName, COUNT[*] orderCount FROM orders INNER JOIN customers USING [customerNumber] GROUP BY customerName ] SELECT customerName, orderCount, CASE orderCount WHEN 1 THEN 'One-time Customer' WHEN 2 THEN 'Repeated Customer' WHEN 3 THEN 'Frequent Customer' ELSE 'Loyal Customer' end customerType FROM cte ORDER BY customerName;
9 trả về sai.Code language: SQL [Structured Query Language] [sql]
WITH cte AS [ SELECT customerName, COUNT[*] orderCount FROM orders INNER JOIN customers USING [customerNumber] GROUP BY customerName ] SELECT customerName, orderCount, CASE orderCount WHEN 1 THEN 'One-time Customer' WHEN 2 THEN 'Repeated Customer' WHEN 3 THEN 'Frequent Customer' ELSE 'Loyal Customer' end customerType FROM cte ORDER BY customerName;
Code language: SQL [Structured Query Language] [sql]
CASE WHEN expression1 THEN result1 WHEN expression2 THEN result2 … [ELSE else_result] END
Đã tìm kiếm biểu thức CASE
Sau đây cho thấy cú pháp của biểu thức CASE
được tìm kiếm:
Trong cú pháp này, CASE
đánh giá các biểu thức được chỉ định trong các mệnh đề ____37. Nếu một biểu thức đánh giá là đúng. Trường hợp trả về kết quả tương ứng trong mệnh đề SELECT
customerName,
state,
country
FROM
customers
ORDER BY [
CASE
WHEN state IS NULL
THEN country
ELSE state
END];
Code language: SQL [Structured Query Language] [sql]
4. Mặt khác, nó trả về kết quả được chỉ định trong mệnh đề ELSE
. Trong trường hợp mệnh đề ELSE
không có sẵn, thì biểu thức CASE
trả về WITH cte AS [
SELECT
customerName,
COUNT[*] orderCount
FROM
orders
INNER JOIN customers
USING [customerNumber]
GROUP BY customerName
]
SELECT
customerName,
orderCount,
CASE orderCount
WHEN 1 THEN 'One-time Customer'
WHEN 2 THEN 'Repeated Customer'
WHEN 3 THEN 'Frequent Customer'
ELSE 'Loyal Customer'
end customerType
FROM
cte
ORDER BY customerName;
Code language: SQL [Structured Query Language] [sql]
8.
SELECT
customerName,
state,
country
FROM
customers
ORDER BY [
CASE
WHEN state IS NULL
THEN country
ELSE state
END];
WITH cte AS [
SELECT
customerName,
COUNT[*] orderCount
FROM
orders
INNER JOIN customers
USING [customerNumber]
GROUP BY customerName
]
SELECT
customerName,
orderCount,
CASE orderCount
WHEN 1 THEN 'One-time Customer'
WHEN 2 THEN 'Repeated Customer'
WHEN 3 THEN 'Frequent Customer'
ELSE 'Loyal Customer'
end customerType
FROM
cte
ORDER BY customerName;
Biểu thức CASE
trả về một kết quả mà loại dữ liệu phụ thuộc vào ngữ cảnh nơi nó được sử dụng. Ví dụ: nếu biểu thức CASE
được sử dụng trong bối cảnh chuỗi ký tự, nó sẽ trả về kết quả dưới dạng chuỗi ký tự. Nếu biểu thức CASE
được sử dụng trong bối cảnh số, nó sẽ trả về kết quả dưới dạng số nguyên, thập phân hoặc giá trị thực.
Xem bảng
5 vàCode language: SQL [Structured Query Language] [sql]
SELECT SUM[CASE WHEN status = 'Shipped' THEN 1 ELSE 0 END] AS 'Shipped', SUM[CASE WHEN status = 'On Hold' THEN 1 ELSE 0 END] AS 'On Hold', SUM[CASE WHEN status = 'In Process' THEN 1 ELSE 0 END] AS 'In Process', SUM[CASE WHEN status = 'Resolved' THEN 1 ELSE 0 END] AS 'Resolved', SUM[CASE WHEN status = 'Cancelled' THEN 1 ELSE 0 END] AS 'Cancelled', SUM[CASE WHEN status = 'Disputed' THEN 1 ELSE 0 END] AS 'Disputed', COUNT[*] AS Total FROM orders;
6 sau:Code language: SQL [Structured Query Language] [sql]
SELECT SUM[CASE WHEN status = 'Shipped' THEN 1 ELSE 0 END] AS 'Shipped', SUM[CASE WHEN status = 'On Hold' THEN 1 ELSE 0 END] AS 'On Hold', SUM[CASE WHEN status = 'In Process' THEN 1 ELSE 0 END] AS 'In Process', SUM[CASE WHEN status = 'Resolved' THEN 1 ELSE 0 END] AS 'Resolved', SUM[CASE WHEN status = 'Cancelled' THEN 1 ELSE 0 END] AS 'Cancelled', SUM[CASE WHEN status = 'Disputed' THEN 1 ELSE 0 END] AS 'Disputed', COUNT[*] AS Total FROM orders;
Tuyên bố sau đây trả về khách hàng và đơn đặt hàng của họ:
Ví dụ này sử dụng biểu thứcCode language: SQL [Structured Query Language] [sql]
SELECT customerName, COUNT[*] orderCount FROM orders INNER JOIN customers USING [customerNumber] GROUP BY customerName ORDER BY COUNT[*];
CASE
trong Điều khoản 3 để trả về loại khách hàng dựa trên số lượng đơn đặt hàng mà khách hàng đã đặt hàng:Code language: SQL [Structured Query Language] [sql]
CASE WHEN expression1 THEN result1 WHEN expression2 THEN result2 … [ELSE else_result] END
This example uses
the CASE
expression in the
3 clause to return the type of customers based on the number of orders that customers ordered:Code language: SQL [Structured Query Language] [sql]
CASE WHEN expression1 THEN result1 WHEN expression2 THEN result2 … [ELSE else_result] END
B] Sử dụng biểu thứcCode language: SQL [Structured Query Language] [sql]
WITH cte AS [ SELECT customerName, COUNT[*] orderCount FROM orders INNER JOIN customers USING [customerNumber] GROUP BY customerName ] SELECT customerName, orderCount, CASE orderCount WHEN 1 THEN 'One-time Customer' WHEN 2 THEN 'Repeated Customer' WHEN 3 THEN 'Frequent Customer' ELSE 'Loyal Customer' end customerType FROM cte ORDER BY customerName;
CASE
trong ví dụ mệnh đề 5Code language: SQL [Structured Query Language] [sql]
CASE WHEN expression1 THEN result1 WHEN expression2 THEN result2 … [ELSE else_result] END
B] Using CASE
expression in the CASE
WHEN expression1 THEN result1
WHEN expression2 THEN result2
…
[ELSE else_result]
END
Code language: SQL [Structured Query Language] [sql]
5 clause example
CASE
WHEN expression1 THEN result1
WHEN expression2 THEN result2
…
[ELSE else_result]
END
Ví dụ sau đây sử dụng biểu thức CASE
để sắp xếp khách hàng theo trạng thái nếu trạng thái không phải là ____ 38, & nbsp; hoặc sắp xếp quốc gia trong trường hợp nhà nước là
8:Code language: SQL [Structured Query Language] [sql]
WITH cte AS [ SELECT customerName, COUNT[*] orderCount FROM orders INNER JOIN customers USING [customerNumber] GROUP BY customerName ] SELECT customerName, orderCount, CASE orderCount WHEN 1 THEN 'One-time Customer' WHEN 2 THEN 'Repeated Customer' WHEN 3 THEN 'Frequent Customer' ELSE 'Loyal Customer' end customerType FROM cte ORDER BY customerName;
Code language: SQL [Structured Query Language] [sql]
SELECT customerName, state, country FROM customers ORDER BY [ CASE WHEN state IS NULL THEN country ELSE state END];
Thử nó ra
C] Sử dụng biểu thức CASE
với ví dụ chức năng tổng hợp
Ví dụ sau sử dụng biểu thức CASE
với hàm CASE
6 để tính tổng số đơn đặt hàng theo trạng thái đơn hàng:
Code language: SQL [Structured Query Language] [sql]
SELECT SUM[CASE WHEN status = 'Shipped' THEN 1 ELSE 0 END] AS 'Shipped', SUM[CASE WHEN status = 'On Hold' THEN 1 ELSE 0 END] AS 'On Hold', SUM[CASE WHEN status = 'In Process' THEN 1 ELSE 0 END] AS 'In Process', SUM[CASE WHEN status = 'Resolved' THEN 1 ELSE 0 END] AS 'Resolved', SUM[CASE WHEN status = 'Cancelled' THEN 1 ELSE 0 END] AS 'Cancelled', SUM[CASE WHEN status = 'Disputed' THEN 1 ELSE 0 END] AS 'Disputed', COUNT[*] AS Total FROM orders;
Thử nó ra
C] Sử dụng biểu thức CASE
với ví dụ chức năng tổng hợp
Ví dụ sau sử dụng biểu thức CASE
với hàm CASE
6 để tính tổng số đơn đặt hàng theo trạng thái đơn hàng:
- Đây là đầu ra:
- Làm thế nào nó hoạt động.
Đầu tiên, câu lệnh CASE
trả về 1 nếu trạng thái bằng trạng thái tương ứng như được vận chuyển, bị giữ, trong quá trình, bị hủy, tranh chấp và không.
Thứ hai, hàm CASE
6 trả về tổng số đơn đặt hàng cho mỗi trạng thái đơn hàng.