DECODE函数的语法如下:DECODE (expr, search1, result1[, search2, result2…][, default])
它用于比较参数expr的值,如果匹配到哪一个search条件,就返回对应的result结果,可以有多组search和result的对应关系,如果任何一个search条件都没有匹配到,则返回最后default的值。default参数是可选的,如果没有提供default参数值,当没有匹配到时,将返回NULL。
查询职员表,根据职员的职位计算奖励金额,当职位分别是’MANAGER’、’ANALYST’、’SALESMAN’时,奖励金额分别是薪水的1.2倍、1.1倍、1.05倍,如果不是这三个职位,则奖励金额取薪水值:
SELECT ename, job, sal,DECODE(job, ‘MANAGER‘, sal*1.2,‘ANALYST‘, sal*1.1,‘SALESMAN‘, sal*1.05, sal) AS bonus FROM emp;
DECODE函数功能相似的有CASE语句,实现类似于if-else的操作。
SELECT ename, job, sal,job
WHEN ‘MANAGER‘ THEN sal * 1.2 WHEN ‘ANALYST‘ THEN sal * 1.1 WHEN ‘SALESMAN‘ THEN sal * 1.05 ELSE sal END bonus FROM emp;
ROW_NUMBER语法如下:ROW_NUMBER() OVER( PARTITION BY col1 ORDER BY col2)
表示根据col1分组,在分组内部根据col2排序。此函数计算的值就表示每组内部排序后的顺序编号,组内连续且唯一。
ROWNUM是伪列, ROW_NUMBER功能更强,可以直接从结果集中取出子集。
场景:按照部门编码分组显示,每组内按职员编码排序,并赋予组内编码
SELECT deptno, ename, empno,ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY empno) AS emp_id FROM emp;
RANK函数的语法如下:RANK() OVER(PARTITION BY col1 ORDER BY col2)
表示根据col1分组,在分组内部根据col2给予等级标识,即排名,相同的数据返回相同排名。特点是跳跃排序,如果有相同数据,则排名相同,比如并列第二,则两行数据都标记为2,但下一位将是第四名。
和ROW_NUMBER的区别是有结果有重复值,而ROW_NUMBER没有。
场景:按照部门编码分组,同组内按薪水倒序排序,相同薪水则按奖金数正序排序,并给予组内等级,用Rank_ID表示
SELECT deptno, ename, sal, comm, RANK() OVER (PARTITION BY deptno ORDER BY sal DESC, comm) "Rank_ID" FROM emp;
※PARTITION 分区
DENSE_RANK函数的语法如下: DENSE_RANK() OVER( PARTITION BY col1 ORDER BY col2)
表示根据col1分组,在分组内部根据col2给予等级标识,即排名,相同的数据返回相同排名。特点是连续排序,如果有并列第二,下一个排序将是三,这一点是和RANK的不同,RANK是跳跃排序。
场景:关联emp和dept表,按照部门编码分组,每组内按照员工薪水排序,列出员工的部门名字、姓名和薪水:
SELECT d.dname, e.ename, e.sal, DENSE_RANK() OVER (PARTITION BY e.deptno ORDER BY e.sal) AS drank FROM emp e join dept d one.deptno = d.deptno;
原文:http://www.cnblogs.com/Jonecmnn/p/6366327.html