【问题标题】:How can I change NULL to 0 when getting a single value from a SQL function?从 SQL 函数获取单个值时,如何将 NULL 更改为 0?
【发布时间】:2010-11-03 13:14:51
【问题描述】:

我有一个查询,计算两个日期之间所有商品的价格。这是选择语句:

SELECT SUM(Price) AS TotalPrice 
FROM Inventory
WHERE (DateAdded BETWEEN @StartDate AND @EndDate)

您可以假设所有表格都已正确设置。

如果我在两个日期之间进行选择并且该日期范围内没有项目,则该函数将返回 NULL 作为 TotalPrice 而不是 0。

如何确保如果没有找到记录,返回 0 而不是 NULL?

【问题讨论】:

    标签: sql tsql null sum


    【解决方案1】:

    您可以使用ISNULL()。

    SELECT ISNULL(SUM(Price), 0) AS TotalPrice 
    FROM Inventory
    WHERE (DateAdded BETWEEN @StartDate AND @EndDate)
    

    这应该可以解决问题。

    【讨论】:

    • 请注意,虽然效率更高,isnull() 只接受 1 个输入而不是 coalesce() 的任何数量,并且isnull() 是 T-SQL 专有的(因此,不可移植)。
    【解决方案2】:

    大多数数据库服务器都有一个COALESCE 函数,该函数将返回第一个非空参数,因此以下内容应该可以满足您的要求:

    SELECT COALESCE(SUM(Price),0) AS TotalPrice
    FROM Inventory
    WHERE (DateAdded BETWEEN @StartDate AND @EndDate)
    

    因为似乎有很多关于的讨论

    如果没有行匹配,COALESCE/ISNULL 仍将返回 NULL,试试这个查询,您可以直接按原样复制并粘贴到 SQL Server:

    SELECT coalesce(SUM(column_id),0) AS TotalPrice 
    FROM sys.columns
    WHERE (object_id BETWEEN -1 AND -2)
    

    请注意,where 子句将 sys.columns 中的所有行排除在考虑范围之外,但“sum”运算符仍会返回一个为空的单行,这会将固定为带有 0 的单行。

    【讨论】:

    • 如果你读到他希望在没有结果的情况下返回 0 的问题,这只有在 sum 的结果为 null 时才有效
    • @Tetraneutron:我认为它会起作用。如果没有行,sum(price) 将为 null,但始终只有一个结果行。
    • COALESCE 工作正常,只要你得到一行来让它运行(在这种情况下你就是这样做的)。如果您没有返回任何行,COALESCE 将无济于事。
    • 我想我应该补充一点,我只在 SQL Server 2008 和 MySQL 5 上尝试过这个——我没有任何其他可用的数据库,但我很确定仅 isnull/coalesce 就可以它在任何数据库上。
    • 您没有要操作的行,问题是“没有找到记录”,所以没有要操作的行,所以合并不起作用。
    【解决方案3】:

    最简单的方法就是在结果中添加零。

    即

    $A=($row['SUM'Price']+0);
    echo $A;
    

    希望这会有所帮助!

    【讨论】:

    • 如果主题起始者有一个 PHP 代码来解释结果,这可能会起作用,但如果问题仅限于 SQL,这将无法作为答案。
    【解决方案4】:

    ORACLE/PLSQL:

    NVL 功能

    SELECT NVL(SUM(Price), 0) AS TotalPrice 
    FROM Inventory
    WHERE (DateAdded BETWEEN @StartDate AND @EndDate)
    

    如果 SUM(Price) 返回空值,则此 SQL 语句将返回 0。否则,它将返回 SUM(Price) 值。

    【讨论】:

      【解决方案5】:

      编辑:看起来其他人都打败了我哈哈

      找到答案了。

      ISNULL() 确定当你有一个空值时要做什么。

      在这种情况下,我的函数返回一个空值,所以我需要指定一个 0 来代替。

      SELECT ISNULL(SUM(Price), 0) AS TotalPrice 
      FROM Inventory
      WHERE (DateAdded 
      BETWEEN @StartDate AND @EndDate)
      

      【讨论】:

      • 我相信 IFNULL 是 MySQL 的等价物,ISNULL 是用于 MS 的 T-SQL。
      • 你有 ISNULL 声明你正在尝试做的事情。我想你想要这个:SUM(ISNULL(Price,0))
      【解决方案6】:

      你可以使用

      SELECT ISNULL(SUM(ISNULL(Price, 0)), 0).

      我 99% 确定这会奏效。

      【讨论】:

      • 不需要内部 ISNULL,因为 SUM 将忽略 NULL 值。
      【解决方案7】:
      SELECT COALESCE(
          (SELECT SUM(Price) AS TotalPrice 
          FROM Inventory
          WHERE (DateAdded BETWEEN @StartDate AND @EndDate))
          , 0)
      

      如果表在响应中有行,则返回 SUM(Price)。如果 SUM 为 NULL 或没有行,它将返回 0。

      如果没有找到行,则在 MSSQL 中放置 COALESCE(SUM(Price), 0) 不起作用。

      【讨论】:

      • 当然,这会阻止您一次从 Inventory 表中获取多个值。
      【解决方案8】:
      SELECT 0+COALESCE(SUM(Price),0) AS TotalPrice
      FROM Inventory
      WHERE (DateAdded BETWEEN @StartDate AND @EndDate)
      

      【讨论】:

      • 在下面查看我的答案。只需使用 ISNULL(或 COALESCE)两次,每行一次,然后求和。 SELECT ISNULL(SUM(ISNULL(Price, 0)), 0))
      猜你喜欢
      • 2015-08-16
      • 1970-01-01
      • 2019-10-03
      • 1970-01-01
      • 2016-11-09
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多