MySQL CASE Expression

摘要:在本教程中,您将学习如何使用 MySQL CASE表达式向查询添加 if-else 逻辑。

MySQL CASE表达式简介

MySQL CASE表达式是一种控制流结构,允许您向查询添加 if-else 逻辑。一般来说,您可以在任何允许有效表达式的地方使用CASE表达式,例如SELECTWHEREORDER BY子句。

CASE表达式有两种形式:简单CASE和搜索CASE

请注意,MySQL 有一个CASE语句,只能在存储过程、存储函数、事件和触发器等存储程序中使用,这不是本教程中介绍的CASE表达式。

简单的CASE表达式

下面说明了简单CASE表达式的语法:

CASE value
   WHEN value1 THEN result1
   WHEN value2 THEN result2
   …
   [ELSE else_result]
ENDCode language: SQL (Structured Query Language) (sql)

在此语法中, CASE将值与value1value2等进行匹配,以相等并返回相应的result1result2 、... 如果该value不等于任何value1value2 、... CASE返回ELSE子句中的结果 if指定了ELSE子句。

CASE将该valueWHEN子句中的values进行比较是否相等,不能将其与NULL一起使用,因为NULL = NULL返回 false。

搜索CASE表达式

下面显示了搜索CASE表达式的语法:

CASE
   WHEN expression1 THEN result1
   WHEN expression2 THEN result2
   …
   [ELSE else_result]
ENDCode language: SQL (Structured Query Language) (sql)

在此语法中, CASE计算WHEN子句中指定的表达式。如果表达式的计算结果为 true。 CASE 返回THEN子句中的相应结果。否则,它返回ELSE子句中指定的结果。如果ELSE子句不可用,则CASE表达式返回NULL

CASE表达式返回一个结果,其数据类型取决于使用它的上下文。例如,如果在字符串上下文中使用CASE表达式,则它将结果作为字符串返回。如果在数字上下文中使用CASE表达式,它将以整数、小数或实数值形式返回结果。

MySQL CASE表达式示例

A) 在SELECT子句中使用CASE表达式示例

请参阅以下orderscustomers表:

以下语句返回客户及其订单:

SELECT 
    customerName, 
    COUNT(*) orderCount
FROM
    orders
INNER JOIN customers 
	USING (customerNumber)
GROUP BY customerName
ORDER BY COUNT(*);Code language: SQL (Structured Query Language) (sql)
MySQL简单CASE表达式示例

此示例在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)
带有 SELECT 子句的 MySQL CASE 表达式

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)

试试看

带有 ORDER BY 子句的 MySQL CASE 表达式

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)

试试看

这是输出:

MySQL CASE 表达式与聚合函数示例

怎么运行的。

  • 首先,如果状态等于相应的状态(例如已发货、暂停、处理中、已取消、有争议),则CASE语句返回 1,否则返回 0。
  • 其次, SUM()函数返回每个订单状态的订单总数。

在本教程中,您学习了如何使用 MySQL CASE表达式向查询添加 if-else 逻辑。

本教程有帮助吗?