大家对 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 。这里需要特别注意