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

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

 

 

你可能感兴趣的:(数据结构,oracle,sql)