----------几个判断赋值函数
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.ENAME = 'SMITH' THEN '姓名asrfsrsfd'
WHEN E.JOB = 'CLERK' THEN '办事员'
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;
DECODE():不是所有的数据库都可以使用
--语法结构:
DECODE(目标字段,判断值1,返回值1,判断值2,返回值2,.....其他返回值);
--需要注意是:
1、它也是会新生成一个列
2、一般用做等值判断(也可以做非等值判断,只不过需要结合其他的函数:比如 SIGN(算术运算))
3、当最后一个参数是在偶数位的时候,那么个参数的值就是 ELSE 的值(上面的语法结构里的 其他返回值)
当最后一个参数是在奇数位的时候,相当于没有 ELSE(意思就是:可能会存在空值)
--比如:查询emp表中的员工的职位,并显示中文
SELECT E.*,
DECODE(E.JOB,
'CLERK',
'办事员',
'MANAGER',
'经理',
'ANALYST',
'分析员',
'SALESMAN',
'销售员',
'总裁') "中文职称"
FROM EMP E;
SIGN():返回里面的运算的结果,如果 结果<0,那么返回 -1
结果=0,那么返回 0
结果>0,那么返回 1
--比如:
SELECT SIGN(1-5),SIGN(1-1),SIGN(5-1) FROM DUAL;