空值处理
特点:oracle数据库中,没有数据表示空,如果空参与计算结果为空.oracle数据库中任何类型都可以为空.
nvl(exp1,exp2)
作用:如果exp1不为空,返回exp1的结果,如果exp1为空,那么返回exp2的结果.
# 查询员工姓名以及员工的月收入(sal+comm)
select ename,sal+nvl(comm,0) from emp;
-- 为查询的结果定义别名
select ename,sal+nvl(comm,0) salary from emp;
-- 使用as关键字
select ename,sal+nvl(comm,0) as salary_total from emp;
-- 别名中存在特殊符号
select ename,sal+nvl(comm,0) "salary total" from emp;
1
2
3
4
5
6
7
8
dual:虚表(伪表),oracle提供一个用于测试函数或者过程的表.
-- 测试nvl2的功能
select nvl2(null,1,2) from dual;
1
2
nvl2(exp1,exp2,exp3)
如果exp1不为null返回exp2的结果,如果exp1为null,那么返回exp3;
-- 如果该员工有提成,那么工资涨幅0.2,没有提成工资不变,存在comm为0
select ename,nvl2(comm,sal+sal*0.2,sal) salary from emp;
1
2
nullif(expr1,expr2)
如果两个表达式相等,那么返回null,否则返回exp1的结果
select nullif(1,1) from dual;
-- 如果该员工有提成,那么工资涨幅0.2,没有提成工资不变,存在comm为0
select ename,nvl2(nullif(comm,0),sal+sal*0.2,sal) salary from emp;
1
2
3
COALESCE(expr1,…,exprn)
返回第一个非空的表达式的值
-- 发奖金,如果工资为null并且提成null发200,如果工资不为空直接发工资,如果提成不为空那么发提成.
select coalesce(sal,comm,200) from emp;
1
2
case 表达式:类似于java中的switch语句
case expr1
when value1 then 执行语句
...
else 执行语句
end --表示结束
-- 如果职位是SALESMAN,工资提高20%,MANAGER工资提高10%,其他提高5%
select ename,sal old_sal,
case job(http://www.amjmh.com/v/BIBRGZ_558768/)
when 'SALESMAN' then sal*1.2
when 'MANAGER' then sal*1.1
else sal*1.05
end new_sal
from emp;
-- 创建成绩表
create table t_grade(
id number primary key,
class varchar2(20),
score number
);
-- 准备数据
insert into t_grade values(1001,'语文',80);
insert into t_grade values(1002,'java',70);
insert into t_grade values(1003,'C++',60);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
SIGN(n)
如果n>0返回1,如果n<0返回-1,如果n=0返回0
select sign(-1) from dual;
--获得成绩表中的等级
select class,
case sign(score-80)
when 1 then '优秀'
when 0 then '优秀'
when -1 then '良好'
end lel
from t_grade;
select class,
case sign(score-80)
when 1 then '优秀'
when 0 then '优秀'
when -1 then
case sign(score-70)
when 1 then '良好'
when 0 then '良好'
else '不及格'
end
end lel
from t_grade;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
decode(expr1,match1,reustl1,…,default);
说明:如果expr1的值和match1匹配,返回result1的结果,如果都不匹配返回defualt的值.
---- 如果职位是SALESMAN,工资提高20%,MANAGER工资提高10%,其他提高5%
select ename,sal old_sal,
decode(job,'SALESMAN',sal*1.2,'MANAGER',sal*1.1,sal*1.05) new_sal
from emp;
--获得成绩表中的等级
select class,
decode(sign(score-80),
0,'优秀',
1,'优秀',
-1,decode(sign(score-70),0,'良好',1,'良好',
-1,decode(sign(score-60),-1,'不及格','及格'))) lel
from t_grade;
1
2
3
4
5
6
7
8
9
10
11
12
13
---------------------