看完这章你会学会以下内容:
- 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;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。