decode函数可以通过比较进行内容的转换,完成的功能相当于分支语句。该函数的第一个参数为要进行转换的表达式,以后的参数成对出现,最后一个参数可以单独出现。如果第一个参数的值与第二个表达式的值相等,则返回第三个表达式的值;如果不等则继续比较,如果它的值与第四个表达式的值相等,则返回第五个表达式的值,以此类推。在参数的最后位置上可以存在单独的参数,如果以上比较过程没有找到匹配值,则返回该参数的值,如果不存在该参数,则返回NULL。

示例:
将职务转换成中文显示。
执行以下查询:

SELECT ename,decode(job, 'MANAGER', '经理', 'CLERK','职员', 'SALESMAN','推销员', 'ANALYST','系统分析员','未知') FROM emp;



结果为:


ENAME DECODE(JOB


-------------- ------------------------


SMITH 职员


ALLEN 推销员


WARD 推销员


JONES 经理


MARTIN 推销员


BLAKE 经理


CLARK 经理


SCOTT 系统分析员


KING 未知


TURNER 推销员


ADAMS 职员


JAMES 职员


FORD 系统分析员


MILLER 职员


已选择14行。



说明:在以上训练中,如果job字段的内容为“MANAGER”则返回“经理”,如果是“CLERK”则返回“职员”,以此类推。如果不是“MANAGER”、“CLERK”、“SALESMAN”和“ANALYST”之一,则返回“未知”,如KING的职务“PRESIDENT”不在上述范围,返回“未知”。




question:


-----------------------------------------------------------


有这样一个表,中有三字段:部门、姓名、工资;


如:


BM NAME GZ


A 张三  890


A 李四 1500


B 王二 3200


...


想得到以下统计结果:


部门 工资<1000人数 工资1000-3000人数 工资>3000人数


A 10 15 8


...


answer:


-----------------------------------------------------------


select bm,


sum(decode(sign(gz - 1000),-1,1,0)) "工资<1000人数",


sum(decode(sign(gz - 1000) + sign(gz - 3000),0,1,0)) "工资1000-3000人数",


sum(decode(sign(gz - 3000),1,1,0)) "工资>3000人数"


from your_table


group by bm ;



附加一个经理写的decode和sign联合起来用的语句



功能是计算滞纳金 4月1号以前滞纳金金额超过罚款金额不再累积4月1日以后的滞纳金



SELECT DECODE(SIGN(TRUNC(to_date('2009-04-01','yyyy-mm-dd')-FBSJ)-17),1,TRUNC(to_date('2009-04-01','yyyy-mm-dd')-FBSJ)-17,0)*.03*WFFKJE as znj41, DECODE(SIGN(TRUNC(SYSDATE-FBSJ)-17-(DECODE(SIGN(TRUNC(to_date('2009-04-01','yyyy-mm-dd')-FBSJ)-17),1,TRUNC(to_date('2009-04-01','yyyy-mm-dd')-FBSJ)-17,0))),1,TRUNC(SYSDATE-FBSJ)-17-DECODE(SIGN(TRUNC(to_date('2009-04-01','yyyy-mm-dd')-FBSJ)-17),1,TRUNC(to_date('2009-04-01','yyyy-mm-dd')-FBSJ)-17,0),0)*.03*WFFKJE as znjLast41, fbsj,wffkje FROM DZJC.DZJC_FLOW F,DZJC.DZJC_WFDM W WHERE F.ZNJBJ='1'  AND F.WFDM=W.DMZ AND F.XH=ANY(81)




黑色头发:http://heisetoufa.iteye.com/