共计 2510 个字符,预计需要花费 7 分钟才能阅读完成。
看完这章你会学会以下内容:
- 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;