MySQL CASE語句

2019-10-16 22:56:19

在本教學中,您將學習如何使用MySQL CASE語句在儲存的程式中構造複雜的條件語句。

除了IF語句,MySQL提供了一個替代的條件語句CASE。 MySQL CASE語句使程式碼更加可讀和高效。

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_1when_expression_2等。如果case_expressionwhen_expression_n的值相等,則執行相應的WHEN分支中的命令(commands)。

如果WHEN子句中的when_expressioncase_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語句。 可搜尋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不允許在THENELSE子句中使用空的命令。 如果您不想處理ELSE子句中的邏輯,同時又要防止MySQL引發錯誤,則可以在ELSE子句中放置一個空的BEGIN END塊。

以下範例演示如何使用可搜尋CASE語句來根據客戶的信用額度來查詢客戶級:SILVERGOLDPLATINUM

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語句。