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;