Oracle对空值(NULL)的 聚合函数 排序

除count之外sum、avg、max、min都为null,count为0

Null 不支持加减乘除,大小比较,相等比较,否则只能为空;只能用‘is [not] null’来进行判断;
Max等聚合函数会自动“过滤null” 
null排序默认最大:
4.处理:

 1)NVL(expr1,expr2):

当两个参数数据类型不同时,oracle会将两个参数进行隐式转换,如果不能隐式转换刚 会报错,隐式转换规则如下:

         1.如果参数1为字符型,则把参数2转换为参数1的类型,返回值为 VARCHAR2

         2.如果参数1为数值型,则判断两个参数的最高数值优先级(如双精实数比单 精实 数优先级高),然后转换成高优先级的数值,返回该类型的值.

2)  NVL2(expr1,expr2, expr3):只看expr2类型

如果expr1不为NULL,返回expr2; expr1为NULL,返回expr3。
expr2和expr3类型不同的话,expr3会转换为expr2的类型,转换不了,则报错。

3) COALESCE ( expression,value1,value2……,valuen) :数据类型要一致

将会返回包括expression在内的所有参数中的第一个非空表达式

如果expression不为空值则返回expression;否则判断value1是否是空值,

如果value1不为空值则返回value1;否则判断value2是否是空值,

如果value2不为空值则返回value2;……以此类推,
如果所有的表达式都为空值,则返回NULL 

那么这里我们可以得出结论:在使用AVG、SUM、MIN、MAX、COUNT聚合函数时,当时用一个列名计算的时候空值会被自动去掉,特别的,当使用COUNT函数使用常量例如(*或1)时,空值不会被自动去掉。

Oracle对空值(NULL)的5种处理

Oracle 中 null 和 '' (空字符串)是一样的
所以用 nvl(field_eng,'') = '' 来判断 field_eng 字段的值是否为 '' 和 null 是不行的
直接用 field_eng is null 即可


数据库中的空值(NULL)经常会导致一些不可预知的错误,我们需要使用数据库提供的方法对空值进行处理,确保数据查询的准确性。

如下表所示,红色标记的值为空值。

分别使用5种方法对数据库的空值进行判断和处理:

1.使用COALESCE函数

COALESCE(expr1,expr2,expr3,…)函数接受一个输入参数的列表,返回第1个非空的参数。如果所有的参数都为空,则返回空值。

案例:

假如我们现在需要查找员工的联系电话,查找的规则如下:先找移动电话;如果没有移动电话,就找工作电话;如果没有工作电话,就找家庭电话;如果没有家庭电话,就找紧急联系人电话;如果以上电话都没有找到,则返回“N/A”。

实现SQL:

 
SELECT t.emp_id,
COALESCE(t.mobile_phone,t.work_phone,t.home_phone,t.emergency_phone,'N/A') AS phone
FROM emp_contact t;

执行结果:

2.使用NULLIF函数

NULLIF(expr1,expr2)函数接受两个输入参数,如果第1个参数等于第2个参数,返回空值;否则,返回第1个参数的值。

实例SQL:

 
SELECT NULLIF(1,2),NULLIF(2,2)
FROM DUAL;

执行结果:

1和2不相等,故返回第一个参数值1。

2和2相等,故返回空。

NULLIF函数的一个常见用途是防止除零错误,例如:

通过NULLIF函数处理后就不会报错了:

3.使用CASE表达式

案例:

查询部门ID为2的部门员工全年收入(包括工资和奖金)

实现SQL:

 
SELECT t.emp_name,
t.salary AS "工资",
t.bonus AS "奖金",
CASE WHEN t.bonus IS NULL THEN t.salary*12
ELSE t.salary*12 + t.bonus
END AS "全年收入"
FROM employee t WHERE t.dept_id=2;

执行结果:

4.使用NVL(expr1,expr2)函数

NVL(expr1,expr2)函数返回第1个非空的参数值,等价于只有两个参数的COALESCE函数。

案例:

查询部门ID为2的部门员工全年收入(包括工资和奖金)

在不使用NVL函数对空值进行处理的情况下,会查询出错误的结果:

使用NVL函数对奖金的值进行处理

实现SQL:

 
SELECT t.emp_name,
t.salary AS "工资",t.bonus AS "奖金",
t.salary*12 + NVL(t.bonus,0) AS "全年收入"
FROM employee t WHERE t.dept_id=2;

执行结果:


这个结果才是我们正确的,即使奖金为空,也不影响全年收入的出值。

5.使用NVL2(expr1,expr2,expr3)函数

NVL2(expr1,expr2,expr3)函数包含3个参数,如果第1个参数不为空,返回第2个参数的值;否则,返回第3个参数的值。

案例:

查询部门ID为2的部门员工全年收入(包括工资和奖金)

实现SQL:

 
SELECT t.emp_name,
t.salary AS "工资",t.bonus AS "奖金",
NVL2(t.bonus,t.salary*12 + t.bonus,t.salary*12 ) AS "全年收入"
FROM employee t WHERE t.dept_id=2;

执行结果:

  • 13
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值