几个判断赋值函数

NVL(参数1,参数2):判断参数1是否为空。如果不为空,则取参数1的值,如果为空,则取参数2的值
                 参数1是目标字段,参数2是一个具体的值
--需要注意:
参数2的值的类型要跟参数1的类型一致
--比如:
SELECT E.*,NVL(E.COMM,0) FROM EMP E;


NVL2(参数1,参数2,参数3):判断参数1是否为空。如果不为空,则取参数2的值,如果为空,则取参数3的值 
                         参数1是目标字段,参数2和参数3是一个具体的值
--需要注意的是:
参数2的值的类型要跟参数3的类型要一致, 可以跟 参数1的类型不一致(只是判断目标字段到底是否为空)                     
--比如:
SELECT E.*,NVL2(E.COMM,1,0) 
FROM EMP E;


CASE WHEN 判断
--语法1结构:
CASE 要比较的字段
    WHEN 值1 THEN 结果1
  [WHEN 值2 THEN 结果2
  .
  .
  .
  ELSE 其他结果]
END

--需要注意的是:
1、位置是在 SELECT 后面作为要查询的信息
2、会生成一个新的列,一般给这个列取个别名
3、最后的 END 不要忘
4、ELSE 不要忘,除非你能列出所有的条件。否则这个新生成的列里面会有空值
5、语法1只能对 单个字段 进行 等值 判断


--比如:查询emp表中的员工的职位,并显示中文
SELECT E.*,
       CASE E.JOB
         WHEN 'CLERK' THEN '办事员'
         WHEN 'SALESMAN' THEN '销售'
         WHEN 'MANAGER' THEN '经理'
         WHEN 'ANALYST' THEN '分析员'
         --ELSE '总裁'
         --WHEN 'PRESIDENT' THEN '总裁'
       END AS "中文职称"
FROM EMP E;


/*小练习一把:查询EMP表中的员工的信息,根据部门编号给员工加薪,
                部门10的加10000
                部门20的加5000
                部门30的加50%
          显示员工的信息以及加薪后的工资*/
SELECT E.*,
       CASE E.DEPTNO
         WHEN 10 THEN E.SAL + 10000
         WHEN 20 THEN E.SAL + 5000
         WHEN 30 THEN E.SAL * 1.5
       END NEW_SAL
FROM EMP E;

--语法2结构
CASE
  WHEN 条件1.1 [AND/OR 条件1.2] THEN 结果1
  [WHEN 条件2.1 [AND/OR 条件2.2] THEN 结果2
  .
  .
  .
  ELSE 其他结果]
END

--需要注意的是:
1、不仅可以做等值(=)判断,也可以做非等值(!= 、<> 、>、 >=、 < 、<= 、IN、 BETWEEN AND)判断
2、可以对多个字段分别进行判断,但是需要注意,两个字段得到的结果不能有交集,否则,会以最先的那个判断为准

--比如:查询emp表中的员工的职位,并显示中文
SELECT E.*,
       CASE
        WHEN E.JOB = 'CLERK' THEN '办事员' 
        WHEN E.ENAME = 'SMITH'  THEN '姓名asrfsrsfd'
         WHEN E.JOB = 'SALESMAN' THEN '销售'
         WHEN E.JOB = 'MANAGER' THEN '经理'
         WHEN E.JOB = 'ANALYST' THEN '分析员'
         ELSE '总裁'
       END "中文职称"
FROM EMP E;

/*小练习一把:查询emp表中员工的信息,给员工加薪
              工资大于2000的,奖金加5000
              工资大于1000的,奖金加8000
              其他的,奖金加20000
      查询员工的信息,以及加薪后的奖金*/ 
SELECT E.*,
       CASE
         WHEN E.SAL > 2000 THEN NVL(E.COMM,0) + 5000
         WHEN E.SAL > 1000 AND E.SAL <= 2000 THEN NVL(E.COMM,0) + 8000
         ELSE NVL(E.COMM,0) + 20000
       END NEW_COMM
FROM EMP E;

WHEN E.JOB = 'CLERK' THEN '办事员' 

--小练习一把:查询部门员工的工资高于该部门的平均工资的员工信息及部门平均工资

SELECT F.*
FROM (SELECT E.*,
           AVG(E.SAL)OVER(PARTITION BY E.DEPTON) DEPT_AVG
           FROM EMP E ) F
WHERE F.SAL >F.DEPT_AVG
查询各个工资等级的平均工资以及员工的信息以及工资等级
SELECT E.*,
FROM SLAERGRATE
       SUM(E.SAL) OVER(PARTITION BY S. ORDER BY E.HIREDATE ASC) DEPT_HIRE_SAL
  FROM EMP E;
  
  SELECT F.*
FROM (
SELECT E.*,
       AVG(SAL)OVER(PARTITION BY E.DEPTNO) DEPT_AVG
FROM EMP E) F
WHERE F.SAL > F.DEPT_AVG;


-小练习一把:分别用三种函数查出各个部门的工资排名
SELECT E.*,
       ROW_NUMBER()OVER(PARTITION BY E.DEPTNO ORDER BY E.SAL ASC) RN,
       RANK()OVER(PARTITION BY E.DEPTNO ORDER BY E.SAL ASC) RK,
       DENSE_RANK()OVER(PARTITION BY E.DEPTNO ORDER BY E.SAL ASC) DR
FROM EMP E;

 SELECT E.*,
       SUM(E.SAL) OVER(PARTITION BY E.DEPTNO ORDER BY E.HIREDATE ASC) DEPT_HIRE_SAL
  FROM EMP E;EMP E;

--小练习一把:查询emp表中各个部门的员工的前一个入职的员工的工资,后一个入职的员工的工资
SELECT E.*,
       LAG(E.SAL, 1, 0) OVER(ORDER BY E.DEPTNO) LAG_SAL,
       LEAD(E.SAL, 1, 0) OVER(ORDER BY E.DEPTNO) LAG_SAL
  FROM EMP E;


SELECT E.*
 LAG(E.SAL,1,0)OVER(ORDER BY E.)
FROM EMP 

CREATE TABLE S (Y NUMBER(4),Q NUMBER (4),AMT NUMBER(4));

INSERT INTO S VALUES (2015,1,100);
INSERT INTO S VALUES (2015,2,100);
INSERT INTO S VALUES (2015,3,100);
INSERT INTO S VALUES (2015,4,100);
INSERT INTO S VALUES (2016,1,100);
INSERT INTO S VALUES (2016,2,100);
INSERT INTO S VALUES (2016,3,100);
INSERT INTO S VALUES (2016,4,100);
COMMIT;

SELECT S.*,
  LEAD (S.AMT,1)OVER(PARTITION BY S.Y ORDER BY S.Q) QQ,
  LEAD (S.AMT,2)OVER(PARTITION BY S.Y ORDER BY S.Q) WW,
  LEAD (S.AMT,3)OVER(PARTITION BY S.Y ORDER BY S.Q) EE
  FROM S) SS
  WHERE SS.Q=1;
  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值