oracle使用nullif解决除数为零的问题分析

 更新时间:2025年11月10日 09:03:08   作者:nayi_224  
文章介绍了如何使用Oracle数据库中的NULLIF函数来解决除数为零的问题,NULLIF函数在两个表达式相等时返回NULL,否则返回第一个表达式,这对于处理复杂的除数问题非常有用,因为它可以避免重复代码,提高可维护性

oracle使用nullif解决除数为零

说一下nullif的语法


NULLIF compares expr1 and expr2. If they are equal, then the function returns null. If they are not equal, then the function returns expr1. You cannot specify the literal NULL for expr1.

If both arguments are numeric data types, then Oracle Database determines the argument with the higher numeric precedence, implicitly converts the other argument to that data type, and returns that data type. If the arguments are not numeric, then they must be of the same data type, or Oracle returns an error.

The NULLIF function is logically equivalent to the following CASE expression:
CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END

如果两个参数相等,返回null,否则返回第一个。

第一个参数不可指定为空。对于非数字类型参数,数据类型必须一致。对于数值数据类型,会隐式的转化为更高优先级的数据类型。(这个理解可能有误,我测试了int,integer,float。但是最终都转化为number类型)。

一般来说

我们处理“除数为零”的问题会用到decode(当然也可以用case,但是写起来代码更多些)。

比如:

dividend / decode(divisor, 0, null, divisor)

但是在除数divisor非常复杂的时候,就需要把这一大串代码写两遍,或者是再套一层view。

无论是哪种,都是极其不利于维护的。

1 / 
decode((sum(t.val) over(order by t.c) +
       nvl(lead(val) over(partition by b order by c), 0)) /
      sum(val) over(partition by b order by c),
      0,
      null,
      (sum(t.val) over(order by t.c) +
       nvl(lead(val) over(partition by b order by c), 0)) / sum(val)
      over(partition by b order by c))

对于这种复杂表达式的除数,每回修改都要改两遍,很容易出错。

利用nullif,可以让除数只写一次。

因为 decode(divisor, 0, null, divisor)nullif(divisor, 0) 是等效的。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Oracle 系统变量函数用法指南

    Oracle 系统变量函数用法指南

    在Oracle数据库中,Oracle系统变量函数是经常会使用到的函数,分享下Oracle系统变量函数的用法。希望对大家有所帮助
    2014-08-08
  • Oracle中的序列SEQUENCE详解

    Oracle中的序列SEQUENCE详解

    本文详细讲解了Oracle中的序列SEQUENCE,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • 处理Oracle监听程序当前无法识别连接描述符中请求的服务异常(ORA-12514)

    处理Oracle监听程序当前无法识别连接描述符中请求的服务异常(ORA-12514)

    这篇文章介绍了处理Oracle监听程序当前无法识别连接描述符中请求的服务异常(ORA-12514),对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • 一次简单的Oracle恢复Case实战记录

    一次简单的Oracle恢复Case实战记录

    这篇文章主要给大家介绍了一次简单的Oracle恢复Case实战过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • Oracle数据块实现原理深入解读

    Oracle数据块实现原理深入解读

    Oracle对数据库数据文件(datafile)中的存储空间进行管理的单位是数据块(data block),本文将详细介绍
    2012-11-11
  • Oracle中ORA-01489:字符串连接的结果过长问题三种解决办法

    Oracle中ORA-01489:字符串连接的结果过长问题三种解决办法

    使用LISTAGG函数拼接字符串超过VARCHAR2长度会报ORA-01489错误,这篇文章主要介绍了Oracle中ORA-01489:字符串连接的结果过长问题的三种解决办法,需要的朋友可以参考下
    2025-07-07
  • Oracle中null值和空字符串的坑及解决

    Oracle中null值和空字符串的坑及解决

    这篇文章主要介绍了Oracle中null值和空字符串的坑及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Oracle实现行列转换的方法分析

    Oracle实现行列转换的方法分析

    这篇文章主要介绍了Oracle实现行列转换的方法,结合实例形式分析了Oracle针对固定列、不定列、列数不固定等情况下的行列转换操作技巧,需要的朋友可以参考下
    2016-08-08
  • oracle 存储过程和触发器复制数据

    oracle 存储过程和触发器复制数据

    oracle 存储过程和触发器复制数据的代码,需要的朋友可以参考下。
    2009-11-11
  • Oracle DML触发器和DDL触发器实例详解

    Oracle DML触发器和DDL触发器实例详解

    Oracle触发器是使用者对Oracle数据库的对象做特定的操作时,触发的一段PL/SQL程序代码器,下面这篇文章主要给大家介绍了关于Oracle DML触发器和DDL触发器的相关资料,需要的朋友可以参考下
    2023-03-03

最新评论