【Oracle】NVL(SUM(a), b) 与 SUM(NVL(a, b)) 的区别

本文通过构造测试表对比了NVL(SUM(a),b)与SUM(NVL(a,b))两种用法的区别,详细解释了这两种用法在处理NULL值时的不同行为,并给出了实际场景下的建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NVL(SUM(a), b) 与 SUM(NVL(a, b)) 的区别

构造一张测试表
SQL> WITH TEMP AS
  2   (SELECT 1 RN, 'SZ' PLANT, '20190321' DATESTR, 459 TOTAL
  3      FROM DUAL
  4    UNION ALL
  5    SELECT 2, 'CD', '20190321', 100
  6      FROM DUAL
  7    UNION ALL
  8    SELECT 3, 'SZ', '20190321', NULL
  9      FROM DUAL)
 10  SELECT T.* FROM TEMP T;
         RN PLANT DATESTR       TOTAL
---------- ----- -------- ----------
         1 SZ    20190321        459
         2 CD    20190321        100
         3 SZ    20190321 

1、NULL值和数字同时存在的情况

  • NVL(SUM(a), b)
SELECT NVL(SUM(T.TOTAL), 0) FROM TEMP T;
NVL(SUM(T.TOTAL),0)
-------------------
                559
  • SUM(NVL(a, b))
SELECT SUM(NVL(T.TOTAL, 0)) FROM TEMP T;
SUM(NVL(T.TOTAL,0))
-------------------
                559

2、全为NULL值

  • SUM(a)
SELECT SUM(T.TOTAL) FROM TEMP T WHERE T.RN = 3;
SUM(T.TOTAL)
------------

  • NVL(SUM(a), b)
SELECT NVL(SUM(T.TOTAL), 0) FROM TEMP T WHERE T.RN = 3;
NVL(SUM(T.TOTAL),0)
------------------
                  0

  • SUM(NVL(a, b))

SELECT SUM(NVL(T.TOTAL, 0)) FROM TEMP T WHERE T.RN = 3;
SUM(NVL(T.TOTAL,0))
--------------------
                  0
3、当记录不存在时
  • SUM(a)
SELECT SUM(T.TOTAL) FROM TEMP T WHERE T.RN = 4;
SUM(T.TOTAL)
------------

  • NVL(SUM(a), b)
SELECT NVL(SUM(T.TOTAL), 0) FROM TEMP T WHERE T.RN = 4;
NVL(SUM(T.TOTAL),0)
-------------------
                  0

  • SUM(NVL(a, b))
SELECT SUM(NVL(T.TOTAL, 0)) FROM TEMP T WHERE T.RN = 4;
SUM(NVL(T.TOTAL,0))
-------------------

总结

  • SUM 求和时自动跳过所有 NULL 值(NULL 值没有-参加运算, 而不是被当做 0 );

  • SUM(NVL(a, b)) 求和时,列中的 NULL 值被当做 b 来运算(上例中当做 0 运算);

    • 记录不存在时。即 a 不存在时,整个 SUM(NVL(a, b)) 为 NULL, 而不是为 b;
  • NVL(SUM(a), b),先进行求和运算,如果为 NULL 值则令其为 b;

    • 记录不存在时。即 a 不存在时,SUM(a) 为 NULL, 但 NVL(SUM(a), b) 的结果为 b;

  • NULL 值与任何数进行基本运算的结果都为 NULL;
  • 基本运算会自动舍弃 NULL 值(这一点可以通过 AVG 函数来进一步验证:有 NULL 值存在时, AVG(a) 与 AVG(NVL(a, 0)) 的结果是不一样的)

  • 一般情况下,建议使用 NVL(SUM(a), b) 的这种写法。
  • 如果有特别严格的需求,甚至可以使用 NVL(SUM(NVL(a, b)), b) 这种写法来双重保险。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HolaSecurity

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值