如何在mysql存储过程中使用case语句
除了if语句之外,mysql还提供了另一种条件语句CASE。 MySQL的CASE语句使代码更具可读性和效率。话不多说,让我们看一下简单的 case 语句的语法:
CASE case_expression WHEN when_expression_1 THEN 命令 WHEN when_expression_2 THEN 命令 ... ELSE命令END CASE;
我们可以使用一个简单的CASE语句来检查表达式的值是否与一组唯一值匹配。在上面的sql中,case_expression可以是任何有效的表达式。我们在每个WHEN子句中将case_expression的值与when_expression进行比较,例如when_expression_1、when_expression_2等。如果cas的值e_expression 和when_expression_n 相等时,执行相应WHEN 分支中的命令。如果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客户国家 varchar(50);从客户中选择国家/地区 INTO customerCountry WHERE customerNumber = p_customerNumber; CASE customerCountry WHEN 'USA' THEN SET p_shiping = '2-day Shipping';当“加拿大”设置 p_shiping = '3 天运送' ; ELSE SET p_shiping = '5 天运送'; END CASE;END$$
上述 SQL 的工作原理如下:
GetCustomerShipping 存储过程接受客户编号作为 IN 参数,以及基于客户所在国家/地区的退货运输时间。
在存储过程中,首先我们根据输入的客户编号获取客户所在的国家。然后使用简单的 CASE 语句来比较客户所在的国家/地区以确定运输期限。如果客户位于美国 (USA),则运送期限为 2 天。如果客户在加拿大,运送期限为 3 天。来自其他国家/地区的客户需要 5 天的运输时间。
我们看一下确定发货时间的逻辑流程图:
下面是上述存储过程的测试脚本:< /p>
SET @customerNo = 112;将国家/地区选择为 @countryFROMcustomersWHERE customernumber = @customerNo;CALL GetCustomerShipping(@customerNo,@shipping);SELECT @customerNo AS Customer, @country AS Country, @shipping AS Shipping;
执行上述代码,得到如下结果:
+----------+---- -----+----------------+
|客户|国家 |运输 |
+---------+---------+----------------+
| 112 | 112美国 | 2 天运送 |
+----------+----------+---------------- +< br/>1 row in set
简单的 CASE 语句只允许我们将表达式的值与一组不同的值进行匹配。为了执行更复杂的匹配,例如范围,我们可以使用可搜索的 CASE 语句。可搜索的 CASE 语句与 IF 语句等效,但其结构更具可读性。我们看一下它的语法结构:
CASE WHEN condition_1 THENCommands WHENcondition_2THENCommands 。 .. ELSE命令END CASE;
上面的sql会首先评估WHEN子句中的每个条件,直到找到值为TRUE的条件,然后执行THEN子句中相应的命令(commands)。 。如果没有一个条件为 TRUE,则执行 ELSE 子句中的命令(命令)。如果您不指定如果有 ELSE 子句并且没有一个条件为 TRUE,mysql 将发出错误消息。 MySQL 不允许在 THEN 或 ELSE 子句中使用空命令。如果我们不想处理ELSE子句中的逻辑,同时又不想让mysql抛出错误,我们可以在ELSE子句中放置一个空的BEGIN END块。我们来看一下使用可搜索的 CASE 语句根据客户的信用额度查找客户级别:SILVER、GOLD 或 PLATINUM 的情况:
DELIMITER $$CREATE过程 GetCustomerLevel( in p_customerNumber int(11), out p_customerLevel varchar(10))开始声明 Creditlim double; SELECT 信用额度 INTO Creditlim FROM 客户 WHERE customerNumber = p_customerNumber;当 Creditlim > 50000 时,设置 p_customerLevel = 'PLATINUM'; WHEN (creditlim <= 50000 AND Creditlim >= 10000) THEN SET p_customerLevel = 'GOLD';当 Creditlim < 10000 时,设置 p_customerLevel = 'SILVER'; END CASE;END$$
在上面的查询中语句逻辑,如果信用额度为:
大于50K,则该客户为PLATINUM客户。
如果小于 50K 且大于 10K,则该客户是 GOLD 客户。
如果低于 10K,则该客户是银级客户。
我们可以通过执行以下测试脚本来测试存储过程:
CALL GetCustomerLevel(112,@level);SELECT @level AS 'Customer Level ';
执行上述查询语句,得到如下结果:
+----------------+< br/> |客户级别 |
+-------------+
| PLATINUM |
+------------ ----+
集合中 1 行
阅读后通过以上内容,大家是不是对mysql存储过程中如何使用case语句有了进一步的了解呢? ?如果您想了解更多知识或相关内容,请关注行业资讯频道。感谢您的支持。
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > 如何在mysql存储过程中使用case语句