66

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

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

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

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

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

4

8 回答 8

110

大多数数据库服务器都有一个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 的单行。

于 2009-06-17T03:55:54.553 回答
20

您可以使用ISNULL().

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

这应该够了吧。

于 2009-06-17T03:56:01.900 回答
11
SELECT 0+COALESCE(SUM(Price),0) AS TotalPrice
FROM Inventory
WHERE (DateAdded BETWEEN @StartDate AND @EndDate)
于 2009-06-17T04:11:11.000 回答
6

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

找到了答案。

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

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

SELECT ISNULL(SUM(Price), 0) AS TotalPrice 
FROM Inventory
WHERE (DateAdded 
BETWEEN @StartDate AND @EndDate)
于 2009-06-17T03:56:12.883 回答
6
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) 不起作用。

于 2011-12-22T06:58:52.580 回答
5

你可以使用

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

我有 99% 的把握这会奏效。

于 2009-06-17T04:38:36.020 回答
1

甲骨文/PLSQL:

NVL 功能

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

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

于 2014-04-25T06:15:17.423 回答
-5

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

IE

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

希望这可以帮助!!

于 2015-01-23T12:39:04.267 回答