大家对 IF ELSE 语句应该都很熟悉吧,它是用来对过程进行控制的。在 SQL 的世界中 CASE 语句有类似的效果。下面简单的介绍 CASE 语句的用法。
CASE 语句的形式
事实上,CASE 语句有两种形式
1 SELECT
2 -- 简单 CASE 语句(Simple CASE)
3 CASE GENDER
4 WHEN 1 THEN '男'
5 ELSE '女'
6 END AS GENDER,
7
8 -- 查询 CASE 语句(Searched CASE)
9 CASE
10 WHEN GENDER = 1 THEN '男'
11 ELSE '女'
12 END AS GENDER
13
14 FROM USER_INFO;
注意点:
1、以CASE开头,以END结尾
2、分支中WHEN 后跟条件,THEN为显示结果
3、ELSE 为除此之外的默认情况,类似于高级语言程序中switch case的default,可以不加
4、END 后跟别名
考虑下面的情况,假设有个 USER_INFO 表,定义如下:
1 CREATE TABLE USER_INFO
2 (
3 NAME VARCHAR2(20) NOT NULL, ---姓名
4 GENDER NUMBER(1,0), ---性别(1、男 2、女)
5 BIRTHDAY DATE ---生日
6 );
7
8 INSERT INTO USER_INFO VALUES ('张三', 1, DATE '2014-12-27');
9 INSERT INTO USER_INFO VALUES ('李四', 2, DATE '2014-12-27');
CASE使用案例 1
把 USER_INFO 表导出生成一个文件,要求性别为男或女,而不是1和2,怎么办?我们可以用如下的语句处理:
1 SELECT
2 NAME,
3 CASE GENDER
4 WHEN 1 THEN '男'
5 ELSE '女'
6 END AS GENDER,
7 BIRTHDAY
8 FROM USER_INFO;
CASE使用案例 2
假设 USER_INFO 目前没有值,然后你往 USER_INFO 导入了一批数据,但是很不幸,错把男设置成为2,而把女设置成为1,现在要求你变换过来,怎么办?
方法1:使用三条语句,先把2更新成3,接着把1更新成2,最后把3更新成1,是不是很麻烦?
1 UPDATE USER_INFO SET GENDER=3 WHERE GENDER=2;
2 UPDATE USER_INFO SET GENDER=1 WHERE GENDER=3;
3 UPDATE USER_INFO SET GENDER=2 WHERE GENDER=1;
方法2:使用CASE语句
1 UPDATE USER_INFO SET GENDER=
2 (
3 CASE GENDER
4 WHEN 1 THEN 2
5 WHEN 2 THEN 1
6 ELSE GENDER
7 END
8 );
DECODE 函数
此外, Oracle 还提供了一个函数来达到和 CASE 语句相同的效果。
1 SELECT DECODE(GENDER, 1, '男', 2, '女', '未知') FROM USER_INFO;
1 DECODE(value,if1,then1,if2,then2,if3,then3,...,else)
表示如果value等于if1时,DECODE函数的结果返回then1,...,如果不等于任何一个if值,则返回else。
If/Else功能实现的3种写法
1 一、单个IF
2 1、
3
4 if a=... then
5 .........
6 end if;
7
8 2、
9
10 if a=... then
11 ......
12 else
13 ....
14 end if;
15
16 二、多个IF
17
18 if a=.. then
19 ......
20 elsif a=.. then
21 ....
22 end if;
23 这里中间是“ELSIF”,而不是ELSE IF 。这里需要特别注意