前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >CASE语句与CASE表达式

CASE语句与CASE表达式

作者头像
Leshami
发布于 2018-08-14 03:00:49
发布于 2018-08-14 03:00:49
1.3K00
代码可运行
举报
文章被收录于专栏:乐沙弥的世界乐沙弥的世界
运行总次数:0
代码可运行

case语句与case表达式是plsql流程控制的重要组成部分,尽管其使用方法较为简单,但容易混淆。本文将描述case语句与case表达式并给出演示以便于更好理解两者的异同及使用时的注意事项。 一、简单case语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-->语法

CASE SELECTOR
WHEN EXPRESSION 1 THEN STATEMENT 1;
WHEN EXPRESSION 2 THEN STATEMENT 2;
...
WHEN EXPRESSION N THEN STATEMENT N;
ELSE STATEMENT N+1;
END CASE;

--简单的case语句是指SELECTOR中得到的值或结果与EXPRESSION n中的值或结果相匹配,一旦找到匹配,则对应的语句被执行。直到找到为止。
--如果对应的EXPRESSION n 中没有匹配,则此时ELSE上阵,执行其后对应的语句。
--ELSE为可选项。如省略且when条件中未找到任何匹配项,则收到case_not_found异常。

-->演示简单case语句
sys@ORCL> DECLARE
  2     v_num    NUMBER := &in_num;
  3     v_flag   NUMBER;
  4  BEGIN
  5     v_flag := MOD (v_num, 2);
  6  
  7     CASE v_flag
  8        WHEN 0
  9        THEN
 10           DBMS_OUTPUT.put_line (v_num || ' is even number');
 11        WHEN 1
 12        THEN
 13           DBMS_OUTPUT.put_line (v_num || ' is odd number');
 14        ELSE
 15           NULL;
 16     END CASE;
 17  END;
 18  /
Enter value for in_num: 5
5 is odd number

PL/SQL procedure successfully completed.

二、搜索式case语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-->语法

CASE
WHEN SEARCH CONDITION 1 THEN STATEMENT 1;
WHEN SEARCH CONDITION 2 THEN STATEMENT 2;
...
WHEN SEARCH CONDITION N THEN STATEMENT N;
ELSE STATEMENT N+1;
END CASE;

--搜索式case语句与简单case语句长相不一样。首先是case 之后没有接selector,其次是when之后的SEARCH CONDITION n得到的结果为布尔型,
--当搜索到第一个为TRUESTATEMENT的结果会被返回。若果所有的when之后的SEARCH CONDITION没有为TRUE的,则else之后的STATEMENT
--的结果会被返回。如果此时省略了else子句,等同于简单case语句,同样会收到case_not_found异常。谁叫他俩一母同胞呢?

-->下面演示搜索式case
scott@ORCL> DECLARE
  2     v_num   NUMBER := &in_num;
  3  BEGIN
  4     CASE
  5        WHEN v_num > 0
  6        THEN
  7           DBMS_OUTPUT.put_line (v_num || ' is a positive number ');
  8        WHEN v_num < 0
  9        THEN
 10           DBMS_OUTPUT.put_line (v_num || ' is a negative number ');
 11        ELSE
 12           DBMS_OUTPUT.put_line (v_num || ' is zero ');
 13     END CASE;
 14  END;
 15  /
Enter value for in_num: -3
-3 is a negative number

-->如下例所示所有的when之后的没有一个为true,且省略了else子句,那么迎接你的是CASE not found
scott@ORCL> DECLARE
  2     v_num   NUMBER := &in_num;
  3  BEGIN
  4     CASE
  5        WHEN v_num > 0
  6        THEN
  7           DBMS_OUTPUT.put_line (v_num || ' is a positive number ');
  8        WHEN v_num < 0
  9        THEN
 10           DBMS_OUTPUT.put_line (v_num || ' is a negative number ');
 11     END CASE;
 12  END;
 13  /
Enter value for in_num: 0
DECLARE
*
ERROR at line 1:
ORA-06592: CASE not found while executing CASE statement
ORA-06512: at line 4

/**************************************************/                                                                        
/* Author: Robinson Cheng                         */                                                                        
/* Blog:   http://blog.csdn.net/robinson_0612     */                                                                        
/* MSN:    robinson_0612@hotmail.com              */                                                                        
/* QQ:     645746311                              */                                                                        
/**************************************************/ 

三、简单case语句与搜索式case语句的异同

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--相同点:两者都用于根据不同的条件,来执行与之对应的语句或完成特定的任务,甚至某些情况下可以互换替换。
--不同点: 
	--简单case语句提供一个selector选择器,且EXPRESSION的数据类型一定与selector的数据类型匹配,否则报错。
	--搜索case语句没有selector选择器,且when子句之后得到的结果一定是一个布尔型值(NULL,TRUR,FALSE)

--下面的例子是一个简单case与搜索case之间互换的例子,同时该方式也实现了行到列的转行。
scott@ORCL> select sum(case when deptno=20 then sal end) as sal_sum_20,   -->搜索式case表达式 @20150713更正
  2  sum(case when deptno=30 then sal end) as sal_sum_30
  3  from emp where comm>300;

SAL_SUM_20 SAL_SUM_30
---------- ----------
     13075       8300

scott@ORCL> select sum(case deptno when 20 then sal end) as sal_sum_20,  -->简单式case表达式  @20150713更正
  2  sum(case deptno when 30 then sal end) as sal_sum_30
  3  from emp where comm>300;

SAL_SUM_20 SAL_SUM_30
---------- ----------
     13075       8300
	 
--使用搜索式case方式,当selector选择器的数据类型不是为布尔型时,收到类型不匹配的提示,如下示例:	 
scott@ORCL> DECLARE
  2     v_num    NUMBER := &sv_num;
  3     v_flag   NUMBER;
  4  BEGIN
      THEN
  5     CASE v_flag
  6        WHEN MOD (v_num, 2) = 0
  7        THEN
  8           DBMS_OUTPUT.PUT_LINE (v_num || ' is even number');
  9        ELSE
 10           DBMS_OUTPUT.PUT_LINE (v_num || ' is odd number');
 11     END CASE;
 12  END;
 13  /
Enter value for sv_num: 7
   CASE v_flag
        *
ERROR at line 5:
ORA-06550: line 5, column 9:
PLS-00615: type mismatch found at 'V_FLAG' between CASE operand and WHEN operands
ORA-06550: line 5, column 4:
PL/SQL: Statement ignored

四、case表达式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--Case表达式与Case语句,如何理解呢?我们不妨来望文生义,便于记忆。分析如下:
--Case表达式,那么when 之后接的一定是表达式或一个特定值。
--Case语句,那么when之后接的特定一个语句,或函数,或计算表达式。既然是语句则一定带有分号。
--最后一点区别是case以end结束,而case语句则是以case end结束。

scott@ORCL> DECLARE
  2     v_num      NUMBER := &in_num;
  3     v_flag     NUMBER;
  4     v_result   VARCHAR2 (20);
  5     BEGIN
  6     v_flag := MOD (v_num, 2);
  7  
  8     v_result :=
  9        CASE v_flag
 10           WHEN 0 THEN TO_CHAR (v_num) || ' is even number'
 11           WHEN 1 THEN TO_CHAR (v_num) || ' is odd number'
 12        END;
 13     DBMS_OUTPUT.put_line (v_result);
 14  END;
 15  /
Enter value for in_num: 3
3 is odd number

PL/SQL procedure successfully completed.

-->下面的写法也较为常用
scott@ORCL> SELECT ename,
  2         CASE deptno
  3            WHEN 20 THEN 'Developement'
  4            WHEN 30 THEN 'Sales'
  5            ELSE 'Clerk'
  6         END
  7            AS deptname
  FROM scott.emp;
  8  
ENAME      DEPTNAME
---------- ------------
john       Clerk
Henry      Developement
ALLEN      Sales
WARD       Sales
..........

五、case嵌套

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--case的嵌套就是case语句和表达式中嵌套case语句与表达式,理解了case的用法,case嵌套并不难。注意casecase end/end的匹配问题
--下面是一个使用case表达式演示的case嵌套示例。
--更新表emp中的comm列,首要case是根据部门来判断,其下又嵌套了一个case,根据comm值的不同来确定新的comm值。
UPDATE scott.emp
   SET comm =
          CASE deptno
             WHEN 20 THEN CASE
                             WHEN comm IS NULL THEN 500
                             WHEN comm < 200 THEN 300
                             ELSE 100
                          END
             WHEN 30 THEN CASE
                             WHEN comm IS NULL THEN 700
                             WHEN comm < 200 THEN 500
                             ELSE 200
                          END
             ELSE 1000
          END;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2012年03月10日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PL/SQL --> 函数
函数通常用于返回特定的数据。其实质是一个有名字的PL/SQL块,作为一个schema对象存储于数据库,可以被反复执行。函数通常被作为
Leshami
2018/08/07
9010
PL/SQL --> 异常处理(Exception)
Exception是一种PL/SQL标识符,当运行的PL/SQL块出现错误或警告,则会触发异常处理。为了提高程序的健壮性,可以在PL/SQL块中引
Leshami
2018/08/07
1.6K0
替代变量与SQL*Plus环境设置
scott@ORCL> select * from emp where empno=7788;
Leshami
2018/08/07
6210
PL/SQL --> 流程控制
类似于高级语言,流程控制语句是PL/SQL语言的重要组成部分。这些流程控制语句使得PL/SQL加大了代码的灵活性和多样性,大大简化了
Leshami
2018/08/07
4200
PL/SQL --> 游标
映射在结果集中某一行数据的具体位置,类似于C语言中的指针。即通过游标方式定位到结果集中某个特定的行,然后根据业务需求
Leshami
2018/08/07
1K0
【DB笔试面试444】Oracle中PL/SQL的流程控制语句包括哪些?
在任何计算机语言(例如C/C++、Java、Pascal、SHELL等)中,都有各种控制语句(条件语句,循环结构,顺序控制结构等),在PL/SQL中也存在这样的控制结构。PL/SQL的流程控制语句包括如下三类:
AiDBA宝典
2019/09/30
1.2K0
PLSQ编程
LOOP 要执行的语句; EXIT WHEN <条件语句> /条件满足,退出循环语句/END LOOP;
全栈程序员站长
2022/07/05
1.5K0
数据库小技能:存储过程(stored procedure)
过程(procedure)又叫存储过程(stored procedure),是一个有名称的PL/SQL程序块 。
公众号iOS逆向
2022/12/19
7630
Oracle PL/SQL随堂笔记总结
1.理解oracle的pl/sql的概念 2.掌握pl/sql编程技术(过程、函数、触发器) pl/sql是标准sql语句的扩展 简介 1.过程、函数、触发器都是由pl/sql编写 2.过程、函数、触发器是在oracle中 3.pl/sql是非常强大的过程语言 4.过程、函数等可以在java程序被调用 学习必要性: 1.提高应用程序的性能 2.模块化的设计思想 3.减少网络传输量 4.提高安全性 不好的方面: 移植性差 pl/sql可以使用变量和逻辑控制语句 可编写:分页存储过程模块,订单处理存储过程模块,转账存储过程模块……
Alfred Zhao
2019/05/24
2K0
Oracle数据库之第四篇
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
海仔
2019/10/22
9470
Oracle-PL/SQL基础
pl/sql(procedural language/sql)是Oracle在标准的sql语言上的扩展,pl/sql不仅允许嵌入Sql语言,还可以定义变量和常量,允许使用条件语句和循环语句,允许使用例外处理各种错误,这样使得它的功能变得更加强大。
小小工匠
2021/08/16
1.8K0
day44_Oracle学习笔记_03
先去Oracle官网去下载最新版本的sqldeveloper,下载地址:https://www.oracle.com/technetwork/developer-tools/sql-developer/downloads/index.html 得到2个zip压缩包,如下图所示:
黑泽君
2018/10/11
1.8K0
day44_Oracle学习笔记_03
javaweb-oracle-2-58
—第一:视图可以屏蔽掉一些敏感字段。 —第二:保证总部和分部数据及时统一。 视图为多表查询提供了上层封装,可以屏蔽某些字段的查询,可以统一操作各表,防止各表查询等操作不及时,信息不统一
全栈程序员站长
2021/05/19
9660
PL/SQL --> 存储过程
存储过程子程序的一种类型,能够完成一些任务,作为schema对象存储于数据库。是一个有名字的PL/SQL代码块,支持接收或不接受参数
Leshami
2018/08/07
1.4K0
Oracle之PL/SQL学习笔记
  自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧。是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家批评指正。   PL/SQL定义:PL/SQL是由Oracle开发,专门用于Oracle的程序设计语言。 PL---Procedural Language. SQL—Structure QueryLanguage。PL/SQL包括过程化语句和SQL语句     PL/SQL的单位:块。 一个块中可以嵌套子块
lizelu
2018/01/12
1.2K0
PL/SQL --> PL/SQL记录
PL/SQL记录有着类似于表的数据结构,是一个或多个字段且拥有数据类型的集合体。定义了PL/SQL记录类型之后,可以定义PL/SQL记录变
Leshami
2018/08/07
7570
Oracle应用实战八(完结)——存储过程、函数+对象曹组
游标 在写java程序中有结果集的概念,那么在pl/sql中也会用到多条记录,这时候我们就要用到游标,游标可以存储查询返回的多条数据。 游标可以理解为是PL/SQL中的结果集,我们通过游标可以提取结果
Java帮帮
2018/03/19
1.9K0
Oracle应用实战八(完结)——存储过程、函数+对象曹组
PL/SQL 编程(二)游标、存储过程、函数
游标--数据的缓存区 游标:类似集合,可以让用户像操作数组一样操作查询出来的数据集,实质上,它提供了一种从集合性质的结果中提取单条记录的手段。 可以将游标形象的看成一个变动的光标,他实质上是一个指针,在一段Oracle存放数据查询结果集或者数据操作结果集的内存中,这个指针可以指向结果集任何一条记录。 游标分静态游标和REF游标两类,静态游标包含显式游标和隐式游标。 显式游标: 在使用之前必须有明确的游标声明和定义,这样的游标定义会关联数据查询语句,通常会返回一行或多行。打开游标后,用户可以利用游标的位置对结
二十三年蝉
2018/02/28
3.8K0
ORACLE触发器具体解释
触发器是很多关系数据库系统都提供的一项技术。在ORACLE系统里,触发器类似过程和函数,都有声明,运行和异常处理过程的PL/SQL块。
全栈程序员站长
2022/07/13
1.2K0
PL/SQL --> 语言基础
PL/SQL是过程化的SQL语言,是ORACLE对SQL语言的扩展,在普通SQL语句的基础上增加了编程语言的特点。使得该语言不仅具有过程编程语
Leshami
2018/08/07
8920
相关推荐
PL/SQL --> 函数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文