mysql存储过程之case语句用法实例详解

 更新时间:2019年12月26日 11:31:45   作者:luyaran  
这篇文章主要介绍了mysql存储过程之case语句用法,结合实例形式详细分析了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天的运输时间。

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

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

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数据库计有所帮助。

相关文章

  • MySQL中存储时间的最佳实践指南

    MySQL中存储时间的最佳实践指南

    这篇文章主要给大家介绍了关于MySQL中存储时间的最佳实践,文中详细介绍了哪种存储时间的方式更好,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友可以参考下
    2021-07-07
  • 如何创建一个创建MySQL数据库中的datetime类型

    如何创建一个创建MySQL数据库中的datetime类型

    这篇文章主要介绍了如何创建一个创建MySQL数据库中的datetime类型,创建一个datetime类型的方法以及create domain 和create type的用法和区别,需要的朋友可以参考一下
    2022-03-03
  • mysql优化连接数防止访问量过高的方法

    mysql优化连接数防止访问量过高的方法

    这篇文章主要介绍了mysql优化连接数防止访问量过高的方法,需要的朋友可以参考下
    2014-06-06
  • Ubuntu上mysql的安装及使用(通用版)

    Ubuntu上mysql的安装及使用(通用版)

    今天小编就为大家分享一篇关于Ubuntu上mysql的安装及使用(通用版),小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • MySQL子查询原理的深入分析

    MySQL子查询原理的深入分析

    子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从 MySQL 4.1 开始引入,下面这篇文章主要介绍了MySQL子查询原理的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-01-01
  • mysql 实现互换表中两列数据方法简单实例

    mysql 实现互换表中两列数据方法简单实例

    这篇文章主要介绍了mysql 实现互换表中两列数据方法简单实例的相关资料,需要的朋友可以参考下
    2016-10-10
  • MYSQL如何查看进程和kill进程

    MYSQL如何查看进程和kill进程

    这篇文章主要介绍了MYSQL如何查看进程和kill进程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • mysql8.0找不到my.ini配置文件的问题及解决

    mysql8.0找不到my.ini配置文件的问题及解决

    这篇文章主要介绍了mysql8.0找不到my.ini配置文件的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 使用MySQL的geometry类型处理经纬度距离问题的方法

    使用MySQL的geometry类型处理经纬度距离问题的方法

    这篇文章主要介绍了使用MySQL的geometry类型处理经纬度距离问题的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • mysql数据库导出xml的实现方法

    mysql数据库导出xml的实现方法

    因为有人问到如何将mysql数据库导出为xml文件,所以发现了这篇文章
    2008-09-09

最新评论