decode(条件, 值1, 返回值1, 值2, 返回值2, ..., 值n, 返回值n, 缺省值)
根据条件返回相应值。假如 decode 如下:
decode(条件, 值1, 返回值1, 值2, 返回值2, ..., 值n, 返回值n, 缺省值)上面语句中,含义如下:
如果“条件”等于“值1”,则返回“返回值1”;
如果“条件”等于“值2”,则返回“返回值2”;
如果“条件”等于“值n”,则返回“返回值n”;
如果“条件”没有匹配到任何值,则返回“缺省值”;
如果将上面 decode 函数转化为 IF-ELSE 语句如下:
IF 条件=值1 THEN
RETURN(返回值1)
ELSIF 条件=值2 THEN
RETURN(返回值2)
......
ELSIF 条件=值n THEN
RETURN(返回值n)
ELSE
RETURN(缺省值)
END IF转换成 CASE WHEN THEN END 语句如下:
CASE WHEN 条件=值1 THEN
RETURN(返回值1)
WHEN 条件=值2 THEN
RETURN(返回值2)
......
WHEN 条件=值n THEN
RETURN(返回值n)
ELSE
RETURN(缺省值)
END注意:值1……值n 不能为条件表达式,这种情况只能用 CASE WHEN THEN END 语句解决
条件:表达式或具体的值
值1...值n:字符型/数值型/日期型,必须类型相同或 null
返回值1...返回值n:字符型/数值型/日期型,必须类型相同或 null
同返回值类型
(1)使用 decode 函数判断当前数据是星期几,如下:
-- 星期表数据
SQL> select * from t_week;
XQN
----------
1
2
3
4
5
6
7
已选择7行。
-- 根据星期几下标返回中文星期名
SQL> select xqn, decode(xqn,1,'星期一',2,'星期二',3,'星期三','星期三之后') from t_week;
XQN DECODE(XQN
---------- ----------
1 星期一
2 星期二
3 星期三
4 星期三之后
5 星期三之后
6 星期三之后
7 星期三之后
已选择7行。(2)比较大小,如下:
SQL> select decode(sign(10-3),-1,100,200) from dual;
DECODE(SIGN(10-3),-1,100,200)
-----------------------------
200sign() 函数根据某个值是 0、正数还是负数,分别返回 0、1、-1。sign(10-3) 返回 1,decode 解码结果为“默认值”。