共計(jì) 2973 個(gè)字符,預(yù)計(jì)需要花費(fèi) 8 分鐘才能閱讀完成。
自動(dòng)寫代碼機(jī)器人,免費(fèi)開通
今天就跟大家聊聊有關(guān)怎么在 mysql 存儲(chǔ)過程中使用 case 語句,可能很多人都不太了解,為了讓大家更加了解,丸趣 TV 小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
除了 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 存儲(chǔ)過程接受客戶編號(hào)作為 IN 參數(shù),并根據(jù)客戶所在國家返回運(yùn)送時(shí)間。
在存儲(chǔ)過程中,首先,我們根據(jù)輸入的客戶編號(hào)得到客戶的國家。然后使用簡單 CASE 語句來比較客戶的國家來確定運(yùn)送期。如果客戶位于美國 (USA),則運(yùn)送期為 2 天。如果客戶在加拿大,運(yùn)送期為 3 天。來自其他國家的客戶則需要 5 天的運(yùn)輸時(shí)間。
來看下確定運(yùn)輸時(shí)間的邏輯的流程圖:
以下是上述存儲(chǔ)過程的測(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
簡單 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 首先會(huì)評(píng)估求值 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ù)客戶的信用額度來查找客戶級(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í)行以下測(cè)試腳本來測(cè)試存儲(chǔ)過程:
CALL GetCustomerLevel(112,@level);
SELECT @level AS Customer Level
執(zhí)行上面查詢語句,得到以下結(jié)果:
+—————-+
| Customer Level |
+—————-+
| PLATINUM |
+—————-+
1 row in set
看完上述內(nèi)容,你們對(duì)怎么在 mysql 存儲(chǔ)過程中使用 case 語句有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注丸趣 TV 行業(yè)資訊頻道,感謝大家的支持。
向 AI 問一下細(xì)節(jié)