当前位置: 移动技术网 > IT编程>数据库>Mysql > mysql存储过程之case语句用法实例详解

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

2020年03月09日  | 移动技术网IT编程  | 我要评论
本文实例讲述了mysql存储过程之case语句用法。分享给大家供大家参考,具体如下: 除了if语句,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

好啦,本次分享就到这里了。

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

  • Ubuntu上Vim安装NERDTree插件的详细操作步骤

    Ubuntu上Vim安装NERDTree插件的详细操作步骤

    nerdtree是vim的文件系统浏览器,使用此插件,用户可以直观地浏览复杂的目录层次结构,快速打开文件以进行读取或编辑,以及执行基本的文件系统操作。nerdt... [阅读全文]
  • MySQL 4种常用的主从复制架构

    MySQL 4种常用的主从复制架构

    一主多从复制架构在主库读取请求压力非常大的场景下,可以通过配置一主多从复制架构实现读写分离,把大量的对实时性要求不是特别高的读请求通过负载均衡分部到多个从库上(... [阅读全文]
  • 浅析MySQL 备份与恢复

    1、简介数据无价,mysql作为一个数据库系统,其备份自然也是非常重要且有必要去做。备份的理由千千万,预防故障,安全需求,回滚,审计,删了又改的需求等等,备份的... [阅读全文]
  • 保障MySQL数据安全的一些建议

    数据是企业核心资产,数据对企业而言是最重要的工作之一。稍有不慎,极有可能发生数据无意泄露,甚至被黑客恶意窃取的风险。每年业界都会传出几起大事件,某知名或不知名的... [阅读全文]
  • MySQL如何快速修改表的表结构

    快速修改mysql某张表的表结构--摘录自《mysql管理之道》alter table 表名 modify 列名 数据类型; 这个命令可以修改表结构此外,也可以... [阅读全文]
  • MySQL 行锁和表锁的含义及区别详解

    一、前言对于行锁和表锁的含义区别,在面试中应该是高频出现的,我们应该对mysql中的锁有一个系统的认识,更详细的需要自行查阅资料,本篇为概括性的总结回答。mys... [阅读全文]
  • MySQL 如何查询当前最新事务ID

    写在前面:在个别时候可能需要查看当前最新的事务 id,以便做一些业务逻辑上的判断(例如利用事务 id 变化以及前后时差,统计每次事务的响应时长等用途)。通常地,... [阅读全文]
  • 如何优雅、安全的关闭MySQL进程

    前言本文分析了 mysqld 进程关闭的过程,以及如何安全、缓和地关闭 mysql 实例,对这个过程不甚清楚的同学可以参考下。关闭过程1、发起 shutdown... [阅读全文]
  • 详解MySQL8.0&#8203; 字典表增强

    详解MySQL8.0&#8203; 字典表增强

    mysql中数据字典是数据库重要的组成部分之一,information_schema首次引入于mysql 5.0,作为一种从正在运行的mysql服务器检索元数据... [阅读全文]
  • 简述MySQL InnoDB存储引擎

    前言:存储引擎是数据库的核心,对于 mysql 来说,存储引擎是以插件的形式运行的。虽然 mysql 支持种类繁多的存储引擎,但最常用的当属 innodb 了,... [阅读全文]
验证码:
移动技术网