看完这章你会学会以下内容:

  • NVL和NVL2语法和常用实例
  • DECODE 和 CASE WHEN 的区别

1.NVL函数的格式如下:NVL(expr1,expr2)
含义:如果oracle第一个参数为空那么显示第二个参数的值,如果第一个参数的值不为空,则显示第一个参数本来的值。

 SELECT NVL(NULL,0),     -- 空转0       NVL(NULL,100),   -- 空转100       NVL('', 99),     -- 空字符转99       NVL(10, 100),    -- 非空不会转       NVL('AD',77)     -- 非空不会转    FROM DUAL;


2.NVL2函数的格式如下:NVL2(expr1,expr2, expr3)
含义:如果该函数的第一个参数为空那么显示第二个参数的值,如果第一个参数的值不为空,则显示第三个参数的值。

 SELECT NVL2(NULL, 0, 1),       -- 空转1       NVL2('', 99, 2),        -- 空字符转2       NVL2(10, 3, 100),       -- 非空转3       NVL2('AD', 'AD', 7)     -- 非空转'AD'    FROM DUAL;

3.应用实例:查看员工信息和其年薪(薪酬+奖金)

SELECT E.*,(SAL + NVL(COMM,0))*12 AS 年薪 FROM EMP E

4.应用实例二:对EMP表中的奖金为空的转换为100,不为空的转换为NULL;

SELECT E.*,NVL2(COMM,NULL,100)AS 奖金 FROM EMP E;


3.DECODE(value,if1,then1,if2,then2,if3,then3,...,else) 含义:如果value与第一个值相等,则与第一个值的匹配值,以此类推,最后都没有的,就返回默认值。
如果有匹配值,则返回对应的匹配值。
如果没有匹配值,则返回空或者默认值。

IF 条件=值1 THEN
RETURN(value 1)
ELSIF 条件=值2 THEN
RETURN(value 2)
......
ELSIF 条件=值n THEN
RETURN(value 3)
ELSE
RETURN(default)
END IF

 SELECT DECODE(12,    -- 原始值           1, 2,           12, 10),    -- 10       DECODE(12,            1, 2,           13, 10),    -- 空       DECODE(12,            1, 2,           13, 10,            7),        -- 给定默认值7       DECODE(12,            1, 2,           12, 10,     -- 找到后就返回值,然后退出,不会向下找          12, 88,           7)   FROM DUAL;  

3.1经典案例: 用英文部门名称返回中文部门,然后匹配该部门下的人数

 -- ACCOUNTING   会计部 -- RESEARCH     研究部 -- SALES        销售部 -- OPERATIONS   操作部     SELECT DECODE(DNAME,           'ACCOUNTING','会计部',           'RESEARCH','市场调查部',           'SALES','销售部',           'OPERATIONS','操作部'           ) AS 部门名称,      COUNT(E.EMPNO) AS 部门人数     FROM DEPT D     LEFT JOIN EMP E     ON E.DEPTNO = D.DEPTNO    GROUP BY D.DNAME;


5. CASE WHEN 多条件判断
CASE [COLUMN_NAME] 语法:
WHEN ['条件参数'] THEN ['COLUMN_NAME/显示内容']
WHEN ['条件参数'] THEN ['COLUMN_NAME/显示内容']
......
ELSE ['COLUMN_NAME/显示内容']
END

5.1经典案例:部门名称的转换 用中文对应相应的中文
*与DECODE函数等效,对单字段等值判断。

SELECT DEPT.*,       (CASE       WHEN DNAME = 'ACCOUNTING' THEN '会计部'       WHEN DNAME = 'RESEARCH' THEN '研究部'       WHEN DNAME = 'SALES' THEN '销售部'       ELSE '操作部'       END) AS 部门    FROM DEPT; 

5.2经典案例:按照指定的条件,对薪酬划分等级。
*与DECODE函数不同,可以对多字段匹配,而且不需要等值匹配。

SELECT E.*      ,CASE WHEN SAL >=4000 THEN '富'      WHEN SAL>=2500 THEN '良'      WHEN SAL>=1000 THEN '中'      ELSE  '穷'      END AS salgrade       FROM EMP E

5.3经典案例更新数据:job为'CLERK' 转为'职员',将其工资增加10%,

                           'SALESMAN' 转为'销售员',将其工资增加5%,                            'MANAGER' 转为'经理',将其工资增加2000,                            'ANALYST' 转为'分析师',将其工资增加6%,                           'PRESIDENT' 转为'老板',其工资不变;            更新数据: update emp set job =(case when job='CLERK' then '职员'                                    when job='SALESMAN' then '销售员'                                    when job='MANAGER' then '经理'                                    when job='ANALYST' then '分析师'                                    when job='PRESIDENT' then '老板'                                    else job                                    end)as 岗位,                           sal= (case when job='CLERK' then sal*(1+0.1)                             when job='SALESMAN' then sal*(1+0.05)                             when job='PRESIDENT' then sal+2000                             when job='MANAGER' then sal*(1+0.06)                             else sal                              end)as 工资                         from emp;   select emp.*,(case when job='CLERK' then '职员'              when job='SALESMAN' then '销售员'              when job='MANAGER' then '经理'              when job='ANALYST' then '分析师'              when job='PRESIDENT' then '老板'              end)as 岗位,          (case when job='CLERK' then sal*(1+0.1)              when job='SALESMAN' then sal*(1+0.05)              when job='PRESIDENT' then sal+2000              when job='MANAGER' then sal*(1+0.06)              when job='ANALYST' then sal              end)as 工资          from emp;