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

Mat*_*att 56 sql t-sql null sum

我有一个查询计算两个日期之间所有项目的价格.这是select语句:

SELECT SUM(Price) AS TotalPrice 
FROM Inventory
WHERE (DateAdded BETWEEN @StartDate AND @EndDate)
Run Code Online (Sandbox Code Playgroud)

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

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

我怎样才能确保如果没有找到记录,则返回0而不是NULL?

Jon*_*upp 98

大多数数据库服务器都有一个COALESCE函数,该函数将返回非空的第一个参数,因此以下内容应该执行您想要的操作:

SELECT COALESCE(SUM(Price),0) AS TotalPrice
FROM Inventory
WHERE (DateAdded BETWEEN @StartDate AND @EndDate)
Run Code Online (Sandbox Code Playgroud)

[编辑]

只是为了澄清事情,因为似乎有很多关于"COALESCE/ISNULL如果没有行匹配仍会返回NULL"的讨论,试试这个查询你可以直接复制并粘贴到SQL Server中:

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

请注意,where子句排除了来自sys.columns的所有行,但是'sum'运算符仍然会返回一行为null的行,它将修复合并为一行为0.

我希望这有助于解释它.


Jos*_*eph 14

SELECT ISNULL(SUM(Price), 0) AS TotalPrice 
FROM Inventory
WHERE (DateAdded BETWEEN @StartDate AND @EndDate)
Run Code Online (Sandbox Code Playgroud)

这应该够了吧.


Bla*_*erX 11

SELECT 0+COALESCE(SUM(Price),0) AS TotalPrice
FROM Inventory
WHERE (DateAdded BETWEEN @StartDate AND @EndDate)
Run Code Online (Sandbox Code Playgroud)


Mat*_*att 6

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

找到了答案.

ISNULL() 确定具有空值时要执行的操作.

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

SELECT ISNULL(SUM(Price), 0) AS TotalPrice 
FROM Inventory
WHERE (DateAdded 
BETWEEN @StartDate AND @EndDate)
Run Code Online (Sandbox Code Playgroud)


小智 6

SELECT COALESCE(
    (SELECT SUM(Price) AS TotalPrice 
    FROM Inventory
    WHERE (DateAdded BETWEEN @StartDate AND @EndDate))
    , 0)
Run Code Online (Sandbox Code Playgroud)

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

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


dkr*_*etz 5

你可以用

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

我 99% 肯定这会奏效。

  • 不需要内部 ISNULL,因为 SUM 将忽略 NULL 值。 (6认同)