MySQL CASE表达式
简介:在本教程中,您将学习如何使用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
在这种语法中,CASE将值与value1,value2等进行匹配,以求相等,并返回相应的result1,result2,…。
如果该值不等于任何value1,value2,……,CASE在ELSE子句中返回结果指定了ELSE子句。
CASE比较该值与WHEN子句中的值是否相等,您不能将其与NULL一起使用,因为NULL = NULL返回false。
搜索的CASE表达式
下面显示了搜索的CASE表达式的语法:
CASE WHEN expression1 THEN result1 WHEN expression2 THEN result2 … [ELSE else_result] END
使用这种语法,CASE评估WHEN子句中指定的表达式。
如果表达式的计算结果为true。
CASE在THEN子句中返回相应的结果。
否则,它将返回ELSE子句中指定的结果。
如果ELSE子句不可用,则CASE表达式返回NULL。
CASE表达式返回结果,其数据类型取决于使用它的上下文。
例如,如果在字符串上下文中使用了CASE表达式,则它将结果作为字符串返回。
如果在数字上下文中使用CASE表达式,它将以整数,十进制或实数值返回结果。
MySQL CASE表达式示例
A)在SELECT子句示例中使用CASE表达式
请参阅以下订单和客户表:
以下语句返回客户及其订单:
SELECT customerName, COUNT(*) orderCount FROM orders INNER JOIN customers USING (customerNumber) GROUP BY customerName ORDER BY COUNT(*);
本示例在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;
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);
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;
这是输出:
这个怎么运作。
首先,如果状态等于相应的状态(例如"已发货","正在处理","正在处理","已取消","有争议"),则CASE语句返回1,否则返回零。
其次,SUM()函数返回每个订单状态的订单总数。
在本教程中,您学习了如何使用MySQL CASE表达式向查询添加if-else逻辑。