DECODE函数是ORACLE
PL/SQL是功能强大的函数之一,目前还只有ORACLE公司的SQL提供了此函数,其他数据库厂商的SQL实现还没有此功能。DECODE函数相当于一条件语句(IF).它将输入数值与函数中的参数列表相比较,根据输入值返回一个对应值。如果未能与任何一个实参匹配成功,则函数也有默认的返回值。
在逻辑编程中,经常用到If – Then –Else
进行逻辑判断。在DECODE的语法中,实际上就是这样的逻辑处理过程。它的类似语法如下:
DECODE(value, if(a), then, if(b),then, . . .
else )
Value
代表某个表的任何类型的任意列或一个通过计算所得的任何结果。当每个value值被测试,如果value的值为if1,Decode
函数的结果是then1;如果value等于if2,Decode函数结果是then2;等等。事实上,可以给出多个if/then
配对。如果value结果不等于给出的任何配对时,Decode 结果就返回else 。
需要注意的是,这里的if、then及else
都可以是函数或计算表达式。
下面来看一个例子:
scott用户下的emp表中的sal一列记录了员工的工资:
select empno ,ename,sal from emp;
EMPNO
ENAME
SAL
-----
----------
---------
7369
SMITH
800.00
7499
ALLEN
1600.00
7521
WARD
1250.00
7566
JONES
2975.00
7654
MARTIN 1250.00
7698
BLAKE
2850.00
7782
CLARK
2450.00
7839
KING
5000.00
7844
TURNER
1500.00
7876
ADAMS
1100.00
7900
JAMES
950.00
7902
FORD
3000.00
7934
MILLER
1300.00
现在想要对工资进行分级,情况如下:
级别
工资
1
0~1000
2
1001~2000
3
2001~5000
4
5000以上
现在用decode来实现:
select empno,ename ,sal,
decode(sign(sal-0),1,decode(sign(1001-sal),1,1,-1,decode(sign(2001-sal),1,2,-1,decode(sign(5001-sal),1,3,-1,4))))
grade from emp;
EMPNO
ENAME
SAL
GRADE
----- ---------- --------- ----------
7369
SMITH
800.00
1
7499
ALLEN
1600.00
2
7521
WARD
950.00
1
7566
JONES
2975.00
3
7654
MARTIN
950.00
1
7698
BLAKE
2850.00
3
7782
CLARK
1950.00
2
7839
KING
5000.00
3
7844
TURNER
1500.00
2
7876
ADAMS
800.00
1
7900
JAMES
950.00
1
7902
FORD
3000.00
3
7934
MILLER
1000.00
1
注:decode函数的判断部分只是是值或者表达式且不能为判断表达式,所以这里判断范围用到了sig函数。级别如果比较多,这个decode就会变得非常臃肿,所以这个例子并不典型和简单。但对于条件部分的理解却是很重要。后面then部分与IF部分类似,也是不能有判断表达式,赋值表达式,只要知道它是返回值就好理解了。