oracle 基础知识:两个number列相加

本文介绍如何使用Oracle SQL中的nvl、nvl2及coalesce函数处理NULL值,以正确计算教师的月总收入,并展示了如何避免因NULL值导致的计算错误。

1查看表结构

SQL> desc teachers;
Name          Type        Nullable Default Comments
------------- ----------- -------- ------- --------
TEACHER_ID    NUMBER(5)                            
NAME          VARCHAR2(8)                          
TITLE         VARCHAR2(6) Y                        
HIRE_DATE     DATE        Y        sysdate         
BONUS         NUMBER(7,2) Y                        
WAGE          NUMBER(7,2) Y                        
DEPARTMENT_ID NUMBER(3)   Y

2查看表的数据

SQL> select * from teachers;
 
TEACHER_ID NAME     TITLE  HIRE_DATE       BONUS      WAGE DEPARTMENT_ID
---------- -------- ------ ----------- --------- --------- -------------
     10101 王彤     教授   1990/9/1      1000.00   3000.00           101
     10104 孔世杰   副教授 1994/7/6       800.00   2700.00           101
     10103 邹人文   讲师   1996/1/21      600.00   2400.00           101
     10106 韩冬梅   助教   2002/8/1       500.00   1800.00           101
     10210 杨文化   教授   1989/10/3     1000.00   3100.00           102
     10206 崔天     助教   2000/9/5       500.00   1900.00           102
     10209 孙晴碧   讲师   1998/5/11      600.00   2500.00           102
     10207 张珂     讲师   1997/8/16      700.00   2700.00           102
     10308 齐沈阳   高工   1989/10/3     1000.00   3100.00           103
     10306 车东日   助教   2001/9/5       500.00   1900.00           103
     10309 臧海涛   工程师 1999/6/29      600.00   2400.00           103
     10307 赵昆     讲师   1996/2/18      800.00   2700.00           103
     10128 王晓            2007/9/5                       1000.00           101
     10328 张笑            2007/9/29                     1000.00           103
     10228 赵天宇          2007/9/18                    1000.00           102
     11111 林飞            2007/10/11                   1000.00

3计算教师月收入,基本工资+奖金

SQL> select t.name as "姓名", t.bonus+t.wage as "月总收入" from teachers t;
 
姓名           月总收入
-------- ----------
王彤           4000
孔世杰         3500
邹人文         3000
韩冬梅         2300
杨文化         4100
崔天           2400
孙晴碧         3100
张珂           3400
齐沈阳         4100
车东日         2400
臧海涛         3000
赵昆           3500
王晓    
张笑    
赵天宇  
林飞    
 
16 rows selected

 

这里可以看到,在奖金为NULL的列上,虽然都为number类型,但这位老师的月收入为空了。显然是不对的。oracle没有默认的实现这个功能。

 

这个时候需要我们采用nvl函数来给列设置默认值,假如是空的,默认为零

 

SQL> select t.name as "姓名", nvl(t.bonus,0)+t.wage as "月总收入" from teachers t;
 
姓名           月总收入
-------- ----------
王彤           4000
孔世杰         3500
邹人文         3000
韩冬梅         2300
杨文化         4100
崔天           2400
孙晴碧         3100
张珂           3400
齐沈阳         4100
车东日         2400
臧海涛         3000
赵昆           3500
王晓           1000
张笑           1000
赵天宇         1000
林飞           1000
 
16 rows selected

 

这样就对了。

还可以使用nvl2函数

SQL> select t.name as "姓名" ,nvl2(t.bonus,t.bonus+t.wage,t.wage) as "总收入" from teachers t;
 
姓名            总收入
-------- ----------
王彤           4000
孔世杰         3500
邹人文         3000
韩冬梅         2300
杨文化         4100
崔天           2400
孙晴碧         3100
张珂           3400
齐沈阳         4100
车东日         2400
臧海涛         3000
赵昆           3500
王晓           1000
张笑           1000
赵天宇         1000
林飞           1000
 
16 rows selected

 

还可以利用coalesce函数(返回表达式中第一个非空值,如果都为空,则返回为空)来计算教师的月收入:

SQL> select t.name as "姓名" ,nvl2(t.bonus,t.bonus+t.wage,t.wage) as "总收入" from teachers t;
 
姓名            总收入
-------- ----------
王彤           4000
孔世杰         3500
邹人文         3000
韩冬梅         2300
杨文化         4100
崔天           2400
孙晴碧         3100
张珂           3400
齐沈阳         4100
车东日         2400
臧海涛         3000
赵昆           3500
王晓           1000
张笑           1000
赵天宇         1000
林飞           1000
 
16 rows selected

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值