mysqlcasewhen处理顺序_mysql存储过程之case语句⽤法实
例详解
本⽂实例讲述了mysql存储过程之case语句⽤法。分享给⼤家供⼤家参考,具体如下:
除了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),pdf文本框怎么设置透明
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$$
html转javascript上述sql的⼯作⽅式如下:
GetCustomerShipping存储过程接受客户编号作为IN参数,并根据客户所在国家返回运送时间。
在存储过程中,⾸先,我们根据输⼊的客户编号得到客户的国家。然后使⽤简单CASE语句来⽐较客户的国家来确定运送期。如果客户位于美国(USA),则运送期为2天。 如果客户在加拿⼤,运送期为3天。 来⾃其他国家的客户则需要5天的运输时间。
来看下确定运输时间的逻辑的流程图:
什么是命令行参数个数
以下是上述存储过程的测试脚本:
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
mysql查看所有存储过程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相关内容感兴趣的读者可查看本站专题:《MySQL存储过程技巧⼤全》、《MySQL常⽤函数⼤汇总》、《MySQL⽇志操作技巧⼤全》、《MySQL事务操作技巧汇总》及《MySQL数据库锁相关技巧汇总》
希望本⽂所述对⼤家MySQL数据库计有所帮助。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论