今天上头要求做一个类似的功能,初步想到的列转行,但是如何实现也没有什么好办法,这个函数不错DECODE函数是ORACLE PL/sql是功能强大的函数之一,目前还只有ORACLE公司的sql提供了此函数,其他数据库厂商的sql实现还没有此功能。DECODE有什么用途 呢? 先构造一个例子,假设我们想给智星职员加工资,其标准是:工资在8000元以下的将加20%;工资在8000元以上的加15%,通常的做法是,先选出记录 中的工资字段值? select salary into var-salary from employee,然后对变量var-salary用if-then-else或choose case之类的流控制语句进行判断。 如果用DECODE函数,那么我们就可以把这些流控制语句省略,通过sql语句就可以直接完成。如下:select decode(sign(salary - 8000),1,salary1.15,-1,salary1.2,salary from employee 是不是很简洁?
DECODE的语法:DECODE(value,if1,then1,if2,then2,if3,then3,...,else),表示如果value 等于if1时,DECODE函数的结果返回then1,如果不等于任何一个if值,则返回else。初看一下,DECODE 只能做等于测试,但刚才也看到了,我们通过一些函数或计算替代value,是可以使DECODE函数具备大于、小于或等于功能。
DECODE(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)
(字段,比较1,值1,比较2,值2,.....,比较n,值n缺省值)函数的含义如下:IF 条件=值1 THEN
RETURN(翻译值1)
ELSIF 条件=值2 THEN
RETURN(翻译值2)
......
ELSIF 条件=值n THEN
RETURN(翻译值n)
ELSE
RETURN(缺省值)
END IF
函数使用技巧
方法:
函数根据某个值是0、正数还是负数,分别返回0、1、-1
301 1300
sql语句为:
select id,decode(sign(score-85),'优秀',
decode(sign(score-70),'良好',
decode(sign(score-60),'及格','不及格')))
from student;
decode (expression,search_1,result_1)
decode (expression,result_1,search_2,result_2)
decode (expression,result_2,....,search_n,result_n)
decode (expression,result_n,default)
函数比较表达式和搜索字,如果匹配,返回结果;如果不匹配,返回default值;如果未定义default值,则返回空值。
以下是一个简单测试,用于说明Decode函数的用法:
sql> create table t as select username,default_tablespace,lock_date from dba_users;
select * from t;
------------------------------ ------------------------------ ---------
SYS SYSTEM
SYSTEM SYSTEM
OUTLN SYSTEM
CSMIG SYSTEM
SCOTT SYSTEM
EYGLE USERS
DBSNMP SYSTEM
WMSYS SYSTEM 20-OCT-04
sql> select username,decode(lock_date,null,'unlocked','locked') status from t;
------------------------------ --------
SYS unlocked
SYSTEM unlocked
OUTLN unlocked
CSMIG unlocked
SCOTT unlocked
EYGLE unlocked
DBSNMP unlocked
WMSYS locked
select username,'unlocked') status from t;
------------------------------ --------
SYS unlocked
SYSTEM unlocked
OUTLN unlocked
CSMIG unlocked
SCOTT unlocked
EYGLE unlocked
DBSNMP unlocked
WMSYS