本文實(shí)例講述了mysql存儲過程之case語句用法。分享給大家供大家參考,具體如下:
除了if語句,mysql提供了一個(gè)替代的條件語句CASE。 mysql的 CASE語句使代碼更加可讀和高效。廢話不多說,我們先來看下簡單case語句的語法:
CASE case_expression
WHEN when_expression_1 THEN commands
WHEN when_expression_2 THEN commands
...
ELSE commands
END CASE;
我們可以使用簡單CASE語句來檢查表達(dá)式的值與一組唯一值的匹配,上述sql中,case_expression可以是任何有效的表達(dá)式。我們將case_expression的值與每個(gè)WHEN子句中的when_expression進(jìn)行比較,例如when_expression_1,when_expression_2等。如果case_expression和when_expression_n的值相等,則執(zhí)行相應(yīng)的WHEN分支中的命令(commands)。如果WHEN子句中的when_expression與case_expression的值匹配,則ELSE子句中的命令將被執(zhí)行。其中,ELSE子句是可選的,如果我們省略ELSE子句,并且找不到匹配項(xiàng),mysql將引發(fā)錯(cuò)誤。我們來看個(gè)使用簡單的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參數(shù),并根據(jù)客戶所在國家返回運(yùn)送時(shí)間。
- 在存儲過程中,首先,我們根據(jù)輸入的客戶編號得到客戶的國家。然后使用簡單CASE語句來比較客戶的國家來確定運(yùn)送期。如果客戶位于美國(USA),則運(yùn)送期為2天。 如果客戶在加拿大,運(yùn)送期為3天。 來自其他國家的客戶則需要5天的運(yùn)輸時(shí)間。
來看下確定運(yùn)輸時(shí)間的邏輯的流程圖:
以下是上述存儲過程的測試腳本:
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;
執(zhí)行上面代碼,得到以下結(jié)果:
+----------+---------+----------------+
| Customer | Country | Shipping |
+----------+---------+----------------+
| 112 | USA | 2-day Shipping |
+----------+---------+----------------+
1 row in set
簡單CASE語句僅允許我們將表達(dá)式的值與一組不同的值進(jìn)行匹配。 為了執(zhí)行更復(fù)雜的匹配,如范圍,我們可以使用可搜索CASE語句。 可搜索CASE語句等同于IF語句,但是它的構(gòu)造更加可讀,來看下它的語法結(jié)構(gòu):
CASE
WHEN condition_1 THEN commands
WHEN condition_2 THEN commands
...
ELSE commands
END CASE;
上述sql首先會評估求值WHEN子句中的每個(gè)條件,直到找到一個(gè)值為TRUE的條件,然后執(zhí)行THEN子句中的相應(yīng)命令(commands)。如果沒有一個(gè)條件為TRUE,則執(zhí)行ELSE子句中的命令(commands)。如果不指定ELSE子句,并且沒有一個(gè)條件為TRUE,mysql將發(fā)出錯(cuò)誤消息。mysql不允許在THEN或ELSE子句中使用空的命令。 如果我們不想處理ELSE子句中的邏輯,同時(shí)又要防止mysql引發(fā)錯(cuò)誤,則可以在ELSE子句中放置一個(gè)空的BEGIN END塊。咱們來看下使用可搜索CASE語句來根據(jù)客戶的信用額度來查找客戶級: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客戶。
我們可以通過執(zhí)行以下測試腳本來測試存儲過程:
CALL GetCustomerLevel(112,@level);
SELECT @level AS 'Customer Level';
執(zhí)行上面查詢語句,得到以下結(jié)果:
+----------------+
| Customer Level |
+----------------+
| PLATINUM |
+----------------+
1 row in set
好啦,本次分享就到這里了。
更多關(guān)于MySQL相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《MySQL存儲過程技巧大全》、《MySQL常用函數(shù)大匯總》、《MySQL日志操作技巧大全》、《MySQL事務(wù)操作技巧匯總》及《MySQL數(shù)據(jù)庫鎖相關(guān)技巧匯總》
希望本文所述對大家MySQL數(shù)據(jù)庫計(jì)有所幫助。
您可能感興趣的文章:- MySQL case when使用方法實(shí)例解析
- MySQL排序中使用CASE WHEN的方法示例
- 深入淺析MySQL 中 Identifier Case Sensitivity問題
- mysql case when group by 實(shí)例詳解
- 詳解Mysql case then使用
- mysql update case 更新字段值不固定的操作