mysql case when 处理顺序_mysql存储过程之case语句用法实例详解

本文实例讲述了mysql存储过程之case语句用法。分享给大家供大家参考,具体如下:

除了if语句,mysql提供了一个替代的条件语句CASE。 mysql的 CASE语句使代码更加可读和高效。废话不多说,我们先来看下简单case语句的语法:

CASE case_expression

WHEN when_expression_1 THEN commands

WHEN when_expression_2 THEN commands

...

ELSE commands

END CASE;

我们可以使用简单CASE语句来检查表达式的值与一组唯一值的匹配,上述sql中,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$$

上述sql的工作方式如下:

GetCustomerShipping存储过程接受客户编号作为IN参数,并根据客户所在国家返回运送时间。

在存储过程中,首先,我们根据输入的客户编号得到客户的国家。然后使用简单CASE语句来比较客户的国家来确定运送期。如果客户位于美国(USA),则运送期为2天。 如果客户在加拿大,运送期为3天。 来自其他国家的客户则需要5天的运输时间。

来看下确定运输时间的逻辑的流程图:

e06c6e745c3f6fbae1163458d4c058ae.png

以下是上述存储过程的测试脚本:

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

WHEN condition_1 THEN commands

WHEN condition_2 THEN commands

...

ELSE commands

END CASE;

上述sql首先会评估求值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相关内容感兴趣的读者可查看本站专题:《MySQL存储过程技巧大全》、《MySQL常用函数大汇总》、《MySQL日志操作技巧大全》、《MySQL事务操作技巧汇总》及《MySQL数据库锁相关技巧汇总》

希望本文所述对大家MySQL数据库计有所帮助。

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论

打赏作者

liuyingliuyun

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值