MySQL CASE表达式

时间:2019-11-20 08:52:20  来源:igfitidea点击:

简介:在本教程中,您将学习如何使用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逻辑。