怎么在mysql存储过程中使用case语句

54次阅读
没有评论

共计 2973 个字符,预计需要花费 8 分钟才能阅读完成。

自动写代码机器人,免费开通

今天就跟大家聊聊有关怎么在 mysql 存储过程中使用 case 语句,可能很多人都不太了解,为了让大家更加了解,丸趣 TV 小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

除了 if 语句,mysql 提供了一个替代的条件语句 CASE。mysql 的 CASE 语句使代码更加可读和高效。废话不多说,我们先来看下简单 case 语句的语法:

CASE case_expression
 WHEN when_expression_1 THEN commands
 WHEN when_expression_2 THEN commands
 ...
 ELSE commands
END CASE;

我们可以使用简单 CASE 语句来检查表达式的值与一组唯一值的匹配,上述 sql 中,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$$

上述 sql 的工作方式如下:

GetCustomerShipping 存储过程接受客户编号作为 IN 参数,并根据客户所在国家返回运送时间。

在存储过程中,首先,我们根据输入的客户编号得到客户的国家。然后使用简单 CASE 语句来比较客户的国家来确定运送期。如果客户位于美国 (USA),则运送期为 2 天。如果客户在加拿大,运送期为 3 天。来自其他国家的客户则需要 5 天的运输时间。

来看下确定运输时间的逻辑的流程图:

怎么在 mysql 存储过程中使用 case 语句

以下是上述存储过程的测试脚本:

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

简单 CASE 语句仅允许我们将表达式的值与一组不同的值进行匹配。为了执行更复杂的匹配,如范围,我们可以使用可搜索 CASE 语句。可搜索 CASE 语句等同于 IF 语句,但是它的构造更加可读,来看下它的语法结构:

CASE
 WHEN condition_1 THEN commands
 WHEN condition_2 THEN commands
 ...
 ELSE commands
END CASE;

上述 sql 首先会评估求值 WHEN 子句中的每个条件,直到找到一个值为 TRUE 的条件,然后执行 THEN 子句中的相应命令 (commands)。如果没有一个条件为 TRUE,则执行 ELSE 子句中的命令 (commands)。如果不指定 ELSE 子句,并且没有一个条件为 TRUE,mysql 将发出错误消息。mysql 不允许在 THEN 或 ELSE 子句中使用空的命令。如果我们不想处理 ELSE 子句中的逻辑,同时又要防止 mysql 引发错误,则可以在 ELSE 子句中放置一个空的 BEGIN END 块。咱们来看下使用可搜索 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$$

在上面查询语句逻辑中,如果信用额度是:

大于 50K,则客户是 PLATINUM 客户。

小于 50K,大于 10K,则客户是 GOLD 客户。

小于 10K,那么客户就是 SILVER 客户。

我们可以通过执行以下测试脚本来测试存储过程:

CALL GetCustomerLevel(112,@level);
SELECT @level AS  Customer Level

执行上面查询语句,得到以下结果:

+—————-+
| Customer Level |
+—————-+
| PLATINUM  |
+—————-+
1 row in set

看完上述内容,你们对怎么在 mysql 存储过程中使用 case 语句有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注丸趣 TV 行业资讯频道,感谢大家的支持。

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-04发表,共计2973字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)