mysql存储过程之case语句用法实例详解
本文实例讲述了mysql存储过程之case语句用法。分享给大家供大家参考,具体如下:
除了if语句,mysql提供了一个替代的条件语句CASE。mysql的CASE语句使代码更加可读和高效。废话不多说,我们先来看下简单case语句的语法:
CASEcase_expression WHENwhen_expression_1THENcommands WHENwhen_expression_2THENcommands ... ELSEcommands ENDCASE;
我们可以使用简单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$$ CREATEPROCEDUREGetCustomerShipping( inp_customerNumberint(11), outp_shipingvarchar(50)) BEGIN DECLAREcustomerCountryvarchar(50); SELECTcountryINTOcustomerCountry FROMcustomers WHEREcustomerNumber=p_customerNumber; CASEcustomerCountry WHEN'USA'THEN SETp_shiping='2-dayShipping'; WHEN'Canada'THEN SETp_shiping='3-dayShipping'; ELSE SETp_shiping='5-dayShipping'; ENDCASE; END$$
上述sql的工作方式如下:
- GetCustomerShipping存储过程接受客户编号作为IN参数,并根据客户所在国家返回运送时间。
- 在存储过程中,首先,我们根据输入的客户编号得到客户的国家。然后使用简单CASE语句来比较客户的国家来确定运送期。如果客户位于美国(USA),则运送期为2天。如果客户在加拿大,运送期为3天。来自其他国家的客户则需要5天的运输时间。
来看下确定运输时间的逻辑的流程图:
以下是上述存储过程的测试脚本:
SET@customerNo=112; SELECTcountryinto@country FROMcustomers WHEREcustomernumber=@customerNo; CALLGetCustomerShipping(@customerNo,@shipping); SELECT@customerNoASCustomer, @countryASCountry, @shippingASShipping;
执行上面代码,得到以下结果:
+----------+---------+----------------+
|Customer|Country|Shipping |
+----------+---------+----------------+
| 112|USA |2-dayShipping|
+----------+---------+----------------+
1rowinset
简单CASE语句仅允许我们将表达式的值与一组不同的值进行匹配。为了执行更复杂的匹配,如范围,我们可以使用可搜索CASE语句。可搜索CASE语句等同于IF语句,但是它的构造更加可读,来看下它的语法结构:
CASE WHENcondition_1THENcommands WHENcondition_2THENcommands ... ELSEcommands ENDCASE;
上述sql首先会评估求值WHEN子句中的每个条件,直到找到一个值为TRUE的条件,然后执行THEN子句中的相应命令(commands)。如果没有一个条件为TRUE,则执行ELSE子句中的命令(commands)。如果不指定ELSE子句,并且没有一个条件为TRUE,mysql将发出错误消息。mysql不允许在THEN或ELSE子句中使用空的命令。如果我们不想处理ELSE子句中的逻辑,同时又要防止mysql引发错误,则可以在ELSE子句中放置一个空的BEGINEND块。咱们来看下使用可搜索CASE语句来根据客户的信用额度来查找客户级:SILVER,GOLD或PLATINUM的案例:
DELIMITER$$ CREATEPROCEDUREGetCustomerLevel( inp_customerNumberint(11), outp_customerLevelvarchar(10)) BEGIN DECLAREcreditlimdouble; SELECTcreditlimitINTOcreditlim FROMcustomers WHEREcustomerNumber=p_customerNumber; CASE WHENcreditlim>50000THEN SETp_customerLevel='PLATINUM'; WHEN(creditlim<=50000ANDcreditlim>=10000)THEN SETp_customerLevel='GOLD'; WHENcreditlim<10000THEN SETp_customerLevel='SILVER'; ENDCASE; END$$
在上面查询语句逻辑中,如果信用额度是:
- 大于50K,则客户是PLATINUM客户。
- 小于50K,大于10K,则客户是GOLD客户。
- 小于10K,那么客户就是SILVER客户。
我们可以通过执行以下测试脚本来测试存储过程:
CALLGetCustomerLevel(112,@level); SELECT@levelAS'CustomerLevel';
执行上面查询语句,得到以下结果:
+----------------+
|CustomerLevel|
+----------------+
|PLATINUM |
+----------------+
1rowinset
好啦,本次分享就到这里了。
更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL存储过程技巧大全》、《MySQL常用函数大汇总》、《MySQL日志操作技巧大全》、《MySQL事务操作技巧汇总》及《MySQL数据库锁相关技巧汇总》
希望本文所述对大家MySQL数据库计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。