当前位置: 首页 > news >正文

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;

执行结果:

http://www.lryc.cn/news/341630.html

相关文章:

  • 我独自升级崛起下载教程 我独自升级崛起一键下载
  • RS2057XH功能和参数介绍及规格书
  • ICML 2024有何亮点?9473篇论文投稿,突破历史记录
  • U盘提示“被写保护”无法操作处理怎么办?
  • 算法训练营第二十天 | LeetCode 110平衡二叉树、LeetCode 257 二叉树的所有路径、LeetCode 404 左叶子之和
  • Docker:centos7安装docker
  • EasyExcel导出工具类
  • 【Godot4.2】EasyTreeData通用解析
  • 力扣每日一题109:有序链表转换二叉搜索树
  • 企业计算机服务器中了locked勒索病毒怎么处理,locked勒索病毒解密建议
  • 开源推荐榜【MalusAdmin基于 Vue3/TypeScript/NaiveUI 和 NET7 Sqlsugar 开发的后台管理框架】
  • 批量抓取某电影网站的下载链接
  • 2024-05-06 问AI: 介绍一下深度学习中的LSTM网络
  • 二、Redis五种常用数据类型-String
  • echarts柱状图实现左右横向对比
  • 脸爱云一脸通智慧管理平台 SystemMng 管理用户信息泄露漏洞(XVE-2024-9382)
  • spring笔记2
  • 【挑战30天首通《谷粒商城》】-【第一天】02、简介-项目整体效果展示
  • Kafka 生产者应用解析
  • GEE错误——image.reduceRegion is not a function
  • rk356x 关于yocto编译linux及bitbake实用方法
  • Chrome您的连接不是私密连接 |输入“thisisunsafe”命令绕过警告or添加启动参数
  • 牛客面试前端1
  • Linux的软件包管理器-yum
  • 选择排序(Selection Sort)
  • 网络面试题目
  • Web,Sip,Rtsp,Rtmp,WebRtc,专业MCU融屏视频混流会议直播方案分析
  • Unreal 编辑器工具 批量重命名资源
  • Voice Conversion、DreamScene、X-SLAM、Panoptic-SLAM、DiffMap、TinySeg
  • 短信群发平台分析短信群发的未来发展趋势