MySQL CASE
简介:在本教程中,您将学习如何使用 MySQL CASE语句在存储程序中构造复杂的条件语句。 除了
IF
语句之外,MySQL还提供了一个名为CASE
语句的替代条件语句。CASE
语句使代码更具可读性和效率。
CASE
声明有两种形式:简单和搜索CASE
语句。
简单的CASE声明
我们来看看简单CASE
语句的语法:
CASE case_expression WHEN when_expression_1 THEN commands WHEN when_expression_2 THEN commands ... ELSE commands END CASE;
可以您使用简单
CASE
语句来检查表达式的值与一组唯一值的匹配。
case_expression
可以是任何有效的表达式。我们将case_expression
的值与每个WHEN
子句中的when_expression
进行比较,例如when_expression_1
,when_expression_2
等。如果case_expression
和when_expression_n
的值相等,则执行相应的WHEN
分支中的命令(commands
)。
如果WHEN
子句中的when_expression
与case_expression
的值匹配,则ELSE
子句中的命令将被执行。ELSE
子句是可选的。如果省略ELSE
子句,并且找不到匹配项,MySQL将引发错误。
示例以下说明如何使用简单的CASE
语句:
DELIMITER $$ CREATE PROCEDURE GetCustomerShipping( in p_customerNumber int(11), out p_shiping varchar(50)) BEGIN DECLARE customerCountry varchar(50); SELECT country INTO customerCountry FROM customers WHERE customerNumber = p_customerNumber; CASE customerCountry WHEN 'USA' THEN SET p_shiping = '2-day Shipping'; WHEN 'Canada' THEN SET p_shiping = '3-day Shipping'; ELSE SET p_shiping = '5-day Shipping'; END CASE; END $$ DELIMITER ;
GetCustomerShipping()
存储过程接受客户编号作为IN
参数,并返回一个基于客户国的出货期。- 在存储过程中,首先,我们根据输入的客户编号获取客户的国家/地区。然后,我们使用简单
CASE
语句来比较客户的国家/地区以确定运输时间。如果客户位于USA
,则运输期间为2-day shipping
。如果客户在Canada
,则运输期间为3-day shipping
。来自其他国家的客户都有5-day shipping
。
SET @customerNo = 112; SELECT country into @country FROM customers WHERE customernumber = @customerNo; CALL GetCustomerShipping(@customerNo,@shipping); SELECT @customerNo AS Customer, @country AS Country, @shipping AS Shipping;这是输出:
+----------+---------+----------------+ | Customer | Country | Shipping | +----------+---------+----------------+ | 112 | USA | 2-day Shipping | +----------+---------+----------------+ 1 row in set (0.00 sec)
搜索CASE声明
简单CASE
语句仅允许您将表达式的值与一组不同的值进行匹配。为了执行更复杂的匹配(例如范围),可以使用搜索的 CASE
语句。搜索的CASE
语句等同于IF
语句,但是它的构造更具可读性。
以下说明了搜索CASE
语句的语法:
CASE WHEN condition_1 THEN commands WHEN condition_2 THEN commands ... ELSE commands END CASE;MySQL会对
WHEN
子句中的每个条件进行求值,直到找到值为TRUE
的条件,然后commands
在THEN
子句中执行相应的条件。
如果没有TRUE
条件,则执行ELSE
子句中的命令。如果您没有指定ELSE
子句且没有条件TRUE
,MySQL将引发错误。
MySQL不允许你在THEN
or ELSE
子句中使用空的commands
。如果您不想ELSE
在防止MySQL引发错误的同时处理子句中的逻辑,则可以 在BEGIN END
的ELSE
子句中放置一个空块。
以下示例演示如何使用搜索CASE
语句查找客户级别SILVER
,GOLD
或PLATINUM
基于客户的信用额度。
DELIMITER $$ CREATE PROCEDURE GetCustomerLevel( in p_customerNumber int(11), out p_customerLevel varchar(10)) BEGIN DECLARE creditlim double; SELECT creditlimit INTO creditlim FROM customers WHERE customerNumber = p_customerNumber; CASE WHEN creditlim > 50000 THEN SET p_customerLevel = 'PLATINUM'; WHEN (creditlim <= 50000 AND creditlim >= 10000) THEN SET p_customerLevel = 'GOLD'; WHEN creditlim < 10000 THEN SET p_customerLevel = 'SILVER'; END CASE; END$$ DELIMITER ;如果信用额度是:
- 超过50K,那么客户就是
PLATINUM
客户。 - 小于50K且大于10K,那么客户就是
GOLD
客户。 - 不到10K,那么客户就是
SILVER
客户。
CALL GetCustomerLevel(112,@level); SELECT @level AS 'Customer Level';
+----------------+ | Customer Level | +----------------+ | PLATINUM | +----------------+ 1 row in set (0.00 sec)在本教程中,我们向您展示了如何使用两种形式的MySQL
CASE
语句,包括简单CASE
语句和搜索CASE
语句。