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_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$$
上面存储过程是如何工作的?
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不允许在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 CASE
语句,包括简单CASE
语句和可搜索CASE
语句。
现在将给您一些技巧,以便您在存储过程中在什么情况分别选择IF
和CASE
语句。
MySQL提供IF
和CASE
语句,使您能够根据某些条件(称为流控制)执行一个SQL代码块。那么您应该使用什么语句? 对于大多数开发人员,在IF
和CASE
之间进行选择只是个人偏好的问题。但是,当您决定使用IF
或CASE
时,应该考虑以下几点:
- 当将单个表达式与唯一值的范围进行比较时,简单CASE语句比IF语句更易读。另外,简单
CASE
语句比IF
语句更有效率。 - 当您根据多个值检查复杂表达式时,
IF
语句更容易理解。 - 如果您选择使用
CASE
语句,则必须确保至少有一个CASE
条件匹配。否则,需要定义一个错误处理程序来捕获错误。IF
语句则不需要处理错误。 - 在大多数组织(公司)中,总是有一些所谓的开发指导文件,为开发人员提供了编程风格的命名约定和指导,那么您应参考本文档并遵循开发实践。
- 在某些情况下,
IF
和CASE
混合使用反而使您的存储过程更加可读和高效。
MySQL存储过程 CASE语句的更多相关文章
- MySQL 存储过程 if语句
MySQL 存储过程 if语句 MySQL IF语句允许您根据表达式的某个条件或值结果来执行一组SQL语句. 要在MySQL中形成一个表达式,可以结合文字,变量,运算符,甚至函数来组合.表达式可以返 ...
- Mysql之case语句(附带实例)
这段时间,做项目做累了,好不容易有点个人的学习时间,利用这个小时,总结一下,最近做统计的时候常用的case语句吧. 结构:case when… then …end 1.判断的同时改变其值 eg: ...
- mysql 存储过程查询语句
可以用 命令"show PROCEDURE status"查看所有的存储过程或检索系统表"mysql.proc"来查询已有的存储过程.例如:用show PROC ...
- mysql存储过程详解
mysql存储过程详解 1. 存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的S ...
- MySQL 存储过程控制语句
变量作用域内部的变量在其作用域范围内享有更高的优先权,当执行到end.变量时,内部变量消失,此时已经在其作用域外,变量不再可见了,应为在存储过程外再也不能找到这个申明的变量,但是你可以通过out参数或 ...
- mysql存储过程详细教程
记录mysql存储过程中的关键语法:DELIMITER // 声明语句结束符,用于区分;CREATE PROCEDURE demo_in_parameter(IN p_in int) 声明存储过程 ...
- MySQL存储过程详解 mysql 存储过程
原文地址:MySQL存储过程详解 mysql 存储过程作者:王者佳暮 mysql存储过程详解 1. 存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储 ...
- MySQL存储过程详解 mysql 存储过程(二)
mysql存储过程详解 1. 存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL ...
- mysql存储过程详解[转]
1. 存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储 ...
随机推荐
- 关于表情的战争APP隐私政策网址
本软件尊重并保护所有使用服务用户的个人隐私权.为了给您提供更准确.更有个性化的服务,本软件会按照本隐私权政策的规定使用和披露您的个人信息.但本软件将以高度的勤勉.审慎义务对待这些信息.除本隐私权政策另 ...
- python数组
1. 初始化一个具有20个元素,元素的值为 1*1, 2*2, 3*3, ......., n*n的数组 A = [i*i for i in range(1, 20)] print A 2. 初始化一 ...
- Git使用之pull request
一直对git的使用都不熟,由于工作需要经常需要在github上pull request,第一次还是有些麻烦的,写个笔记记录下 1. fork源项目到自己的github仓库中 fork之后自己也会多出一 ...
- 利用RALL机制来事项String类的赋值操作
class String{ public: char *str; String(const char *ptr=NULL){ if(ptr==NULL) { str=NULL; }else{ str= ...
- IDE中使用System.getProperty()获取一些属性
使用环境:一般在项目首页或者项目后端配置中会使用到一些属性获取: package com.liuyc.study.utils; /** * 获取当前操作系统中或者当前环境中的一些默认配置 * @aut ...
- go basic
go time and rand: package main import ( "fmt" "math/rand" "time" ) fun ...
- dataguard日志自动删除
dataguard日志自动删除 1.判断日志是否已经应用到今天.2.删除3天前的日志.3.主机.备机分别配置 ----check_del_arch.sh#!/bin/shORACLE_HOME=/ho ...
- python,Day2,基础 2
list和dict list是一种有序的集合,可以随时添加和删除其中的元素. 例如: >>>classmates = ['eason','grace','alice'] >&g ...
- RDLC报表数据集的一个细节,导致错误为 尚未数据源提供数据源实例
报表中,数据集的名字DataSet_CZ, 这里报表这样加载,视乎是的. reportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporti ...
- python各种转义字符