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),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天的運輸時間。
來看下確定運輸時間的邏輯的流程圖:
以下是上述儲存過程的測試指令碼:
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相關內容感興趣的讀者可檢視本站專題:《MySQL儲存過程技巧大全》、《MySQL常用函式大彙總》、《MySQL日誌操作技巧大全》、《MySQL事務操作技巧彙總》及《MySQL資料庫鎖相關技巧彙總》
希望本文所述對大家MySQL資料庫計有所幫助。