【问题标题】:NULL to zero with ISNULL使用 ISNULL 将 NULL 归零
【发布时间】:2014-05-07 16:40:44
【问题描述】:

我有以下 SQL 语句:

SELECT name, SUM(growth) AS sum_buy_price, SUM(recovery) AS sum_msrp, SUM(growth)+SUM(recovery) AS total 
FROM orders 
WHERE id = ? 
GROUP BY name

我的数据来自我无法控制的 CSV 文件,并且数据中的“增长”或“恢复”可以为 NULL,但不能同时为 NULL。我需要使用 ISNULL 将可能的 NULL 值转换为零以使 SUM 正常工作,但我不确定如何/在何处添加 ISNULL,因为 SELECT 正在索引另一条记录(名称)。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    ISNULL 返回传递的参数是否为空(即类似于真或假)。我想,你需要的是 IFNULL:

    SELECT
      name,
      SUM(IFNULL(growth, 0))                         AS sum_buy_price,
      SUM(IFNULL(recovery, 0))                       AS sum_msrp,
      SUM(IFNULL(growth, 0))+SUM(IFNULL(recovery,0)) AS total
    FROM
      orders
    WHERE
      id = ?
    GROUP BY
      name
    

    【讨论】:

      【解决方案2】:

      SUM() 函数会忽略 NULL 值,因此您无需将 NULL 更改为 0 即可使其正常工作。

      但是,如果您聚合的所有值都是 NULL 并且您想要返回 0 而不是 NULL 您可以使用 IFNULL() 或更常见的 COALESCE()0 显示为总和而不是NULL

      SELECT COALESCE(SUM(growth),0)
      

      ISNULL() 是一个有效的 SQL Server 函数,IFNULL() 在 MySQL 中是等价的,但所有主要数据库都使用COALESCE(),它返回集合中的第一个非 NULL 值,即:COALESCE(NULL,NULL,5) 将返回5

      【讨论】:

      • 它会忽略 null 所在的整行吗?所以如果你做一个 count(*)| sum(total) 和一个总值为空,计数还会增加吗?
      • 它只忽略给定列的NULL 值,而不是行。这是一个简单的演示:sqlfiddle.com/#!2/9dbc5b/2/0 更新了演示以显示 COUNT(*)COUNT(col1) 之间的区别。
      • 所以 count 仍然会增加,但 sum(total) 不会。谢谢
      • 没错,同样,如果您不想计算NULL 行,您可以使用COUNT(growth) 而不是COUNT(*)
      • 感谢您的帮助!
      【解决方案3】:

      这应该适合你:

      SELECT name, SUM(ISNULL(growth, 0)) AS sum_buy_price, 
      SUM(ISNULL(recovery, 0)) AS sum_msrp, 
      SUM(ISNULL(growth, 0))+SUM(ISNULL(recovery,0)) AS total 
      FROM orders 
      WHERE id = ? 
      GROUP BY name
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-21
        • 1970-01-01
        • 2017-12-04
        • 2011-10-12
        • 1970-01-01
        • 2020-11-08
        • 2021-07-02
        相关资源
        最近更新 更多