case [<表达式>]
when <表达式条件值1> then <满足条件时返回值1>
[when <表达式条件值2> then <满足条件时返回值2>
……
[else <不满足上述条件时返回值>]]
end当 <表达式>=<表达式条件值1……n> 时,返回对应 <满足条件时返回值1……n>。
当 <表达式条件值1……n> 不为条件表达式时,与函数 decode() 相同。
decode(<表达式>,<表达式条件值1>,<满足条件时返回值1>,<表达式条件值2>,<满足条件时返回值2> ……,<不满足上述条件时返回值>)。
注意:
以CASE开头,以END结尾
分支中WHEN 后跟条件,THEN为显示结果
ELSE 为除此之外的默认情况,类似于高级语言程序中switch case的default,可以不加
END 后跟别名
只返回第一个符合条件的值,剩下的when部分将会被自动忽略,得注意条件先后顺序
<表达式> 默认为 true (逻辑型)
<表达式条件值1……n> 类型要与<表达式>类型一致,若<表达式>为字符型,则<表达式条件值1……n>也要为字符型
满足条件时返回值1......n
建立环境:
create table t_week (xqn number(1,0));
insert into t_week (xqn) values(1);
insert into t_week (xqn) values(2);
insert into t_week (xqn) values(3);
insert into t_week (xqn) values(4);
insert into t_week (xqn) values(5);
insert into t_week (xqn) values(6);
insert into t_week (xqn) values(7);
commit;查询结果:
SQL> select xqn,
2 case xqn
3 when 1 then '星期一'
4 when 2 then '星期二'
5 when 3 then '星期三'
6 else '星期三以后'
7 end 星期
8 from t_week;
XQN 星期
---------- ----------
1 星期一
2 星期二
3 星期三
4 星期三以后
5 星期三以后
6 星期三以后
7 星期三以后
已选择7行。另类写法,如下:
SQL> select xqn,
2 case
3 when xqn=1 then '星期一'
4 when xqn=2 then '星期二'
5 when xqn=3 then '星期三'
6 else '星期三以后'
7 end 星期
8 from t_week;
XQN 星期
---------- ----------
1 星期一
2 星期二
3 星期三
4 星期三以后
5 星期三以后
6 星期三以后
7 星期三以后
已选择7行。decode 正确表达:
SQL> SELECT xqn,
2 decode(xqn,1,'星期一',2,'星期二',3,'星期三','星期三以后') 星期
3 from t_week;
XQN 星期
---------- ----------
1 星期一
2 星期二
3 星期三
4 星期三以后
5 星期三以后
6 星期三以后
7 星期三以后
已选择7行。decode 错误表达:
SQL> SELECT xqn,
2 decode(TRUE,xqn=1,'星期一',xqn=2,'星期二',xqn=3,'星期三','星期三以后') 星期
3 from t_week;
decode(TRUE,xqn=1,'星期一',xqn=2,'星期二',xqn=3,'星期三','星期三以后') 星期
*
第 2 行出现错误:
ORA-00907: 缺失右括号组合条件表达:
SELECT xqn,
CASE
WHEN xqn <= 1 THEN '星期一'
-- 条件同:not(xqn<=1) and xqn<=2
WHEN xqn <= 2 THEN '星期二'
-- 条件同:not(xqn<=1 and xqn<=2) and xqn<=3
WHEN xqn <= 3 THEN '星期三'
ELSE '星期三以后'
END 星期
FROM t_week;