mysql存儲(chǔ)過(guò)程之case語(yǔ)句用法實(shí)例詳解
本文實(shí)例講述了mysql存儲(chǔ)過(guò)程之case語(yǔ)句用法。分享給大家供大家參考,具體如下:
除了if語(yǔ)句,mysql提供了一個(gè)替代的條件語(yǔ)句CASE。 mysql的 CASE語(yǔ)句使代碼更加可讀和高效。廢話不多說(shuō),我們先來(lái)看下簡(jiǎn)單case語(yǔ)句的語(yǔ)法:
CASE case_expression WHEN when_expression_1 THEN commands WHEN when_expression_2 THEN commands ... ELSE commands END CASE;
我們可以使用簡(jiǎn)單CASE語(yǔ)句來(lái)檢查表達(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ò)誤。我們來(lái)看個(gè)使用簡(jiǎn)單的CASE語(yǔ)句的例子:
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存儲(chǔ)過(guò)程接受客戶編號(hào)作為IN參數(shù),并根據(jù)客戶所在國(guó)家返回運(yùn)送時(shí)間。
- 在存儲(chǔ)過(guò)程中,首先,我們根據(jù)輸入的客戶編號(hào)得到客戶的國(guó)家。然后使用簡(jiǎn)單CASE語(yǔ)句來(lái)比較客戶的國(guó)家來(lái)確定運(yùn)送期。如果客戶位于美國(guó)(USA),則運(yùn)送期為2天。 如果客戶在加拿大,運(yùn)送期為3天。 來(lái)自其他國(guó)家的客戶則需要5天的運(yùn)輸時(shí)間。
來(lái)看下確定運(yùn)輸時(shí)間的邏輯的流程圖:
以下是上述存儲(chǔ)過(guò)程的測(cè)試腳本:
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
簡(jiǎn)單CASE語(yǔ)句僅允許我們將表達(dá)式的值與一組不同的值進(jìn)行匹配。 為了執(zhí)行更復(fù)雜的匹配,如范圍,我們可以使用可搜索CASE語(yǔ)句。 可搜索CASE語(yǔ)句等同于IF語(yǔ)句,但是它的構(gòu)造更加可讀,來(lái)看下它的語(yǔ)法結(jié)構(gòu):
CASE WHEN condition_1 THEN commands WHEN condition_2 THEN commands ... ELSE commands END CASE;
上述sql首先會(huì)評(píng)估求值WHEN子句中的每個(gè)條件,直到找到一個(gè)值為TRUE的條件,然后執(zhí)行THEN子句中的相應(yīng)命令(commands)。如果沒(méi)有一個(gè)條件為TRUE,則執(zhí)行ELSE子句中的命令(commands)。如果不指定ELSE子句,并且沒(méi)有一個(gè)條件為TRUE,mysql將發(fā)出錯(cuò)誤消息。mysql不允許在THEN或ELSE子句中使用空的命令。 如果我們不想處理ELSE子句中的邏輯,同時(shí)又要防止mysql引發(fā)錯(cuò)誤,則可以在ELSE子句中放置一個(gè)空的BEGIN END塊。咱們來(lái)看下使用可搜索CASE語(yǔ)句來(lái)根據(jù)客戶的信用額度來(lái)查找客戶級(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$$
在上面查詢語(yǔ)句邏輯中,如果信用額度是:
- 大于50K,則客戶是PLATINUM客戶。
- 小于50K,大于10K,則客戶是GOLD客戶。
- 小于10K,那么客戶就是SILVER客戶。
我們可以通過(guò)執(zhí)行以下測(cè)試腳本來(lái)測(cè)試存儲(chǔ)過(guò)程:
CALL GetCustomerLevel(112,@level); SELECT @level AS 'Customer Level';
執(zhí)行上面查詢語(yǔ)句,得到以下結(jié)果:
+----------------+
| Customer Level |
+----------------+
| PLATINUM |
+----------------+
1 row in set
好啦,本次分享就到這里了。
更多關(guān)于MySQL相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《MySQL存儲(chǔ)過(guò)程技巧大全》、《MySQL常用函數(shù)大匯總》、《MySQL日志操作技巧大全》、《MySQL事務(wù)操作技巧匯總》及《MySQL數(shù)據(jù)庫(kù)鎖相關(guān)技巧匯總》
希望本文所述對(duì)大家MySQL數(shù)據(jù)庫(kù)計(jì)有所幫助。
相關(guān)文章
MySQL的日志基礎(chǔ)知識(shí)及基本操作學(xué)習(xí)教程
這篇文章主要介紹了MySQL的日志基礎(chǔ)知識(shí)學(xué)習(xí)教程,包括MySQL中日志相關(guān)常用的服務(wù)器變量說(shuō)明,極力推薦!需要的朋友可以參考下2015-11-11mysql中You can’t specify target table for update in FROM clau
這篇文章主要介紹了mysql中You can’t specify target table for update in FROM clause錯(cuò)誤解決方法,需要的朋友可以參考下2015-02-02Mysql的root賬戶密碼忘記了怎么解決(百分百教會(huì)你重置!)
mysql是常用的數(shù)據(jù)庫(kù),很多程序員在使用的過(guò)程中會(huì)出現(xiàn)root用戶密碼忘記的事情,這篇文章主要給大家介紹了關(guān)于Mysql的root賬戶密碼忘記了該怎么解決的相關(guān)資料,文中介紹的方法百分百教會(huì)你如何重置,需要的朋友可以參考下2024-05-05MySQL?數(shù)據(jù)庫(kù)范式化設(shè)計(jì)理論總結(jié)
這篇文章主要介紹了MySQL?數(shù)據(jù)庫(kù)范式設(shè)計(jì)理論總結(jié),數(shù)據(jù)庫(kù)的規(guī)劃化范式設(shè)計(jì),在邏輯結(jié)構(gòu)上可以讓結(jié)構(gòu)更加細(xì)粒度,容易理解,下文我們就來(lái)了解具體的內(nèi)容介紹吧2022-04-04MySQL實(shí)現(xiàn)簡(jiǎn)單的創(chuàng)建庫(kù)和創(chuàng)建表操作方法
MySQL是最常用的數(shù)據(jù)庫(kù),在數(shù)據(jù)庫(kù)操作中基本都是增刪改查操作,簡(jiǎn)稱CRUD,這篇文章主要給大家介紹了關(guān)于MySQL實(shí)現(xiàn)簡(jiǎn)單的創(chuàng)建庫(kù)和創(chuàng)建表操作方法的相關(guān)資料,需要的朋友可以參考下2023-11-11講解Linux系統(tǒng)下如何自動(dòng)備份MySQL數(shù)據(jù)的基本教程
這篇文章主要介紹了Linux系統(tǒng)下如何自動(dòng)備份MySQL數(shù)據(jù)的基本教程,還給出了利用shell腳本全備份和增量備份的基本方法,需要的朋友可以參考下2015-11-11mysql5.7.19 winx64安裝配置方法圖文教程(win10)
這篇文章主要為大家詳細(xì)介紹了mysql5.7.19 winx64安裝配置教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07詳解MySQL數(shù)據(jù)庫(kù)insert和update語(yǔ)句
用于操作數(shù)據(jù)庫(kù)的SQL一般分為兩種,一種是查詢語(yǔ)句,也就是我們所說(shuō)的SELECT語(yǔ)句,另外一種就是更新語(yǔ)句,也叫做數(shù)據(jù)操作語(yǔ)句。接下來(lái)通過(guò)本文給大家介紹MySQL數(shù)據(jù)庫(kù)insert和update語(yǔ)句,需要的朋友一起學(xué)習(xí)吧2016-04-04