在本教學中,您將學習如何使用MySQL CASE
語句在儲存的程式中構造複雜的條件語句。
除了IF語句,MySQL提供了一個替代的條件語句CASE
。 MySQL CASE
語句使程式碼更加可讀和高效。
CASE
語句有兩種形式:簡單的搜尋CASE
語句。
我們來看一下簡單CASE
語句的語法:
CASE case_expression
WHEN when_expression_1 THEN commands
WHEN when_expression_2 THEN commands
...
ELSE commands
END CASE;
您可以使用簡單CASE
語句來檢查表示式的值與一組唯一值的匹配。
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$$
上面儲存過程是如何工作的?
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
語句的語法:
CASE
WHEN condition_1 THEN commands
WHEN condition_2 THEN commands
...
ELSE commands
END CASE;
MySQL評估求值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 CASE
語句,包括簡單CASE
語句和可搜尋CASE
語句。