zoukankan      html  css  js  c++  java
  • MySQL存储过程 CASE语句

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

    现在将给您一些技巧,以便您在存储过程中在什么情况分别选择IFCASE语句。

    MySQL提供IF和CASE语句,使您能够根据某些条件(称为流控制)执行一个SQL代码块。那么您应该使用什么语句? 对于大多数开发人员,在IFCASE之间进行选择只是个人偏好的问题。但是,当您决定使用IFCASE时,应该考虑以下几点:

    • 当将单个表达式与唯一值的范围进行比较时,简单CASE语句比IF语句更易读。另外,简单CASE语句比IF语句更有效率。
    • 当您根据多个值检查复杂表达式时,IF语句更容易理解。
    • 如果您选择使用CASE语句,则必须确保至少有一个CASE条件匹配。否则,需要定义一个错误处理程序来捕获错误。IF语句则不需要处理错误。
    • 在大多数组织(公司)中,总是有一些所谓的开发指导文件,为开发人员提供了编程风格的命名约定和指导,那么您应参考本文档并遵循开发实践。
    • 在某些情况下,IFCASE混合使用反而使您的存储过程更加可读和高效。
  • 相关阅读:
    string的不可变性
    <转载>网页设计中的F式布局
    Jmeter使用插件对服务器进行性能监控
    服务端的性能测试
    Linux下性能监视神器dstat用法
    服务器性能带宽实时监控
    Linux下查看系统剩余空间
    监控服务器带宽性能的命令
    监控服务器性能命令
    python3+appium app自动化实现左滑功能
  • 原文地址:https://www.cnblogs.com/BlueSkyyj/p/10435930.html
Copyright © 2011-2022 走看看