从 SQL 函数获取单个值时,如何将 NULL 更改为 0?

Posted

技术标签:

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

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

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

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

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

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

【问题讨论】:

【参考方案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))

以上是关于从 SQL 函数获取单个值时,如何将 NULL 更改为 0?的主要内容,如果未能解决你的问题,请参考以下文章

我的 SQL 函数有啥问题,当我尝试在 C# 中检索它的值时它总是返回 null?

如何访问从sql函数获取的java中的多个返回值

Oracle/SQL:将日期和时间连接成单个日期值时的数字格式模型无效

SSIS和NULL值

如何使用单个 SQL 聚合函数查询为同一个聚合函数获取多个结果?

数组中的字符串仅在尝试获取单个值时返回未定义?