摘要:在本教程中,您将学习如何使用 MySQL CASE
表达式向查询添加 if-else 逻辑。
MySQL CASE
表达式简介
MySQL CASE
表达式是一种控制流结构,允许您向查询添加 if-else 逻辑。一般来说,您可以在任何允许有效表达式的地方使用CASE
表达式,例如SELECT
、 WHERE
和ORDER BY
子句。
CASE
表达式有两种形式:简单CASE
和搜索CASE
。
请注意,MySQL 有一个CASE
语句,只能在存储过程、存储函数、事件和触发器等存储程序中使用,这不是本教程中介绍的CASE
表达式。
简单的CASE
表达式
下面说明了简单CASE
表达式的语法:
CASE value
WHEN value1 THEN result1
WHEN value2 THEN result2
…
[ELSE else_result]
END
Code language: SQL (Structured Query Language) (sql)
在此语法中, CASE
将值与value1
、 value2
等进行匹配,以相等并返回相应的result1
、 result2
、... 如果该value
不等于任何value1
、 value2
、... CASE
返回ELSE
子句中的结果 if指定了ELSE
子句。
CASE
将该value
与WHEN
子句中的values
进行比较是否相等,不能将其与NULL
一起使用,因为NULL = NULL
返回 false。
搜索CASE
表达式
下面显示了搜索CASE
表达式的语法:
CASE
WHEN expression1 THEN result1
WHEN expression2 THEN result2
…
[ELSE else_result]
END
Code language: SQL (Structured Query Language) (sql)
在此语法中, CASE
计算WHEN
子句中指定的表达式。如果表达式的计算结果为 true。 CASE 返回THEN
子句中的相应结果。否则,它返回ELSE
子句中指定的结果。如果ELSE
子句不可用,则CASE
表达式返回NULL
。
CASE
表达式返回一个结果,其数据类型取决于使用它的上下文。例如,如果在字符串上下文中使用CASE
表达式,则它将结果作为字符串返回。如果在数字上下文中使用CASE
表达式,它将以整数、小数或实数值形式返回结果。
MySQL CASE
表达式示例
A) 在SELECT
子句中使用CASE
表达式示例
请参阅以下orders
和customers
表:
以下语句返回客户及其订单:
SELECT
customerName,
COUNT(*) orderCount
FROM
orders
INNER JOIN customers
USING (customerNumber)
GROUP BY customerName
ORDER BY COUNT(*);
Code language: SQL (Structured Query Language) (sql)
此示例在SELECT
子句中使用CASE
表达式,根据客户订购的订单数量返回客户类型:
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)
B) 在ORDER BY
子句中使用CASE
表达式示例
以下示例使用CASE
表达式,如果州不为NULL
,则按州对客户进行排序;如果州为NULL
,则对国家/地区进行排序:
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)
C) 使用CASE
表达式和聚合函数示例
以下示例使用CASE
表达式和SUM()
函数来按订单状态计算销售订单总数:
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;
Code language: SQL (Structured Query Language) (sql)
这是输出:
怎么运行的。
- 首先,如果状态等于相应的状态(例如已发货、暂停、处理中、已取消、有争议),则
CASE
语句返回 1,否则返回 0。 - 其次,
SUM()
函数返回每个订单状态的订单总数。
在本教程中,您学习了如何使用 MySQL CASE
表达式向查询添加 if-else 逻辑。