转自:HTTPS://blog.csdn.net/shangboerds/article/details/41989283
在编程语言中IF ELSE语句用来对过程进行控制,在SQL的世界中CASE语句有类似的效果。下面简单的介绍CASE语句的用法。
CASE语句的形式
首先了解一下CSAE语句的两种形式,简单case语句和查询case语句:
- 选择
- - 简单CASE语句(Simple CASE)
- CASE GENDER
- WHEN 1 THEN '男'
- ELSE '女'
- END AS 性别,
- - 查询CASE语句(Searched CASE)
- 案件
- 当 性别= 1 那么'男'
- ELSE '女'
- END AS 性别
- FROM USER_INFO;
接下来我们举例说明case语句的用法。假设有个USER_INFO表,定义如下:
- CREATE TABLE USER_INFO
- (
- NAME VARCHAR2(20) NOT NULL , ---姓名
- 性别号码(1,0), ---性别(1,男2,女)
- BIRTHDAY DATE ---生日
- );
- INSERT INTO USER_INFO VALUES ('张三' ,1, DATE '2014年12月27日' );
- INSERT INTO USER_INFO VALUES ('李四' ,2, DATE '2014年12月27日' );
CASE使用案例1
把USER_INFO表导出生成一个文件,要求性别为男或女,而不是1和2,怎么办我们可以用如下的语句处理?:
- 选择
- NAME ,
- CASE GENDER
- WHEN 1 THEN '男'
- ELSE '女'
- END AS 性别,
- 生日
- FROM USER_INFO;
CASE使用案例2
假设USER_INFO目前没有值,然后你往USER_INFO导入了一批数据,但是很不幸,错把男设置成为2,而把女设置成为1,现在要求你变换过来,怎么办?
方法1:使用三条语句,先把2更新成3,接着把1更新成2,最后把3更新成1,是不是很麻烦?
- UPDATE USER_INFO SET GENDER = 3 WHERE GENDER = 2;
- UPDATE USER_INFO SET GENDER = 1 WHERE GENDER = 3;
- UPDATE USER_INFO SET GENDER = 2 WHERE GENDER = 1;
方法2 :使用CASE语句
- UPDATE USER_INFO SET GENDER =
- (
- CASE GENDER
- WHEN 1 THEN 2
- WHEN 2 THEN 1
- ELSE GENDER
- 结束
- );
细心的朋友可能已经发现了,上面的方法1的三条语句的执行顺序有问题,没错,是我故意那些写的,仅仅是把1变成2,把2变成1就那么麻烦,而且很容易出错,想象一下,如果有很多这样的值需要变换,那是一种什么样的情况。还好,我们有CASE语句,有好多这样的值需要变换,CASE语句也不会存在问题。
CASE使用案例3
假设让你把张三的生日更新成1949年10月1日,李四的生日更新成1997年7月1日等,类似这样的更新有很多。该怎么办呢?非常简单,大多数人会这么做。
- UPDATE USER_INFO SET BIRTHDAY = DATE '1949年10月1日' WHERE NAME = '张三' ;
- UPDATE USER_INFO SET BIRTHDAY = DATE '1997年7月1日' WHERE NAME = '李四' ;
当USER_INFO表的数据量非常大,而NAME字段上又没有索引时,每条语句都要进行全表扫描,如果这样的语句有很多,效率会非常差,这时候我们可以用CASE语句,如下:
- UPDATE USER_INFO SET BIRTHDAY =
- (
- CASE NAME
- 当'张三' THEN 日期'1949年10月1日'
- WHEN '李四' THEN 日期'1997年7月1日'
- ELSE BIRTHDAY
- 结束
- )
- WHERE NAME 在 ('张三' ,'李四' );
最后,再来回顾一下CASE语句的两种形式,你记住了吗?
- 选择
- - 简单CASE语句(Simple CASE)
- CASE GENDER
- WHEN 1 THEN '男'
- ELSE '女'
- END AS 性别,
- - 查询CASE语句(Searched CASE)
- 案件
- 当 性别= 1 那么'男'
- ELSE '女'
- END AS 性别
- FROM USER_INFO;
DECODE函数
此外,甲骨文还提供了一个函数来达到和CASE语句相同的效果。
- SELECT DECODE(GENDER,1, '男' ,2, '女' , '未知' ) FROM USER_INFO;