decode函数_【SQL 常用函数】第六集 其余判断函数

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

  • 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;

cd886c2d6fd66870ad6d44e2ee5ae2ef.png


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;

b625fdea4a7cd14479c6e07c7c358c94.png


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

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

3021d0a5456a351fd0cee1455c0b045e.png


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

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

3680d6b1c0b85fa0bf060a3b2dd34ff7.png


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;  

19a6730ebca1566c812d0b665b0da495.png


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;

05a1d7c891b0eb6a8ab4ac7369226d7a.png

5. CASE WHEN 多条件判断
CASE [COLUMN_NAME] 语法:
WHEN ['条件参数'] THEN ['COLUMN_NAME/显示内容']
WHEN ['条件参数'] THEN ['COLUMN_NAME/显示内容']
......
ELSE ['COLUMN_NAME/显示内容']
END5.1经典案例:部门名称的转换 用中文对应相应的中文
*与DECODE函数等效,对单字段等值判断。

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

56e423232ee9e5cca50a4ce56383c5fa.png

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

4606580b77c82653d4039c6d3ccaeb2b.png

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;

235ae0de32829a2f863ce98d4f4bdacc.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值