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) ----------------------------- 200
sign() 函数根据某个值是 0、正数还是负数,分别返回 0、1、-1。sign(10-3) 返回 1,decode 解码结果为“默认值”。