我有一个查询计算两个日期之间所有项目的价格。这是select语句:
SELECT SUM(Price) AS TotalPrice
FROM Inventory
WHERE (DateAdded BETWEEN @StartDate AND @EndDate)
您可以假设所有表格都已正确设置。
如果我在两个日期之间进行选择并且该日期范围内没有任何项目,则该函数将返回NULL作为TotalPrice而不是0。
如何确保找不到记录,返回0而不是NULL?
答案 0 :(得分:95)
大多数数据库服务器都有一个COALESCE函数,该函数将返回非空的第一个参数,因此以下内容可以执行您想要的操作:
SELECT COALESCE(SUM(Price),0) AS TotalPrice
FROM Inventory
WHERE (DateAdded BETWEEN @StartDate AND @EndDate)
[编辑]
只是为了澄清事情,因为似乎有很多关于“如果没有行匹配,COALESCE / ISNULL仍将返回NULL”的讨论,请尝试此查询,您可以直接复制并粘贴到SQL Server中:< / p>
SELECT coalesce(SUM(column_id),0) AS TotalPrice
FROM sys.columns
WHERE (object_id BETWEEN -1 AND -2)
请注意,where子句会排除sys.columns中的所有行,但是'sum'运算符仍然会返回一行为null的行,它将修复合并为一行为0。 / p>
我希望这有助于解释它。
答案 1 :(得分:13)
SELECT ISNULL(SUM(Price), 0) AS TotalPrice
FROM Inventory
WHERE (DateAdded BETWEEN @StartDate AND @EndDate)
这应该可以解决问题。
答案 2 :(得分:11)
SELECT 0+COALESCE(SUM(Price),0) AS TotalPrice
FROM Inventory
WHERE (DateAdded BETWEEN @StartDate AND @EndDate)
答案 3 :(得分:6)
编辑:看起来其他人都打败了我哈哈
找到答案。
ISNULL()
确定当您具有空值时要执行的操作。
在这种情况下,我的函数返回一个空值,所以我需要指定一个0来代替。
SELECT ISNULL(SUM(Price), 0) AS TotalPrice
FROM Inventory
WHERE (DateAdded
BETWEEN @StartDate AND @EndDate)
答案 4 :(得分:6)
SELECT COALESCE(
(SELECT SUM(Price) AS TotalPrice
FROM Inventory
WHERE (DateAdded BETWEEN @StartDate AND @EndDate))
, 0)
如果表在响应中有行,则返回SUM(Price)。如果SUM为NULL或没有行,则返回0.
如果没有找到行,则放置COALESCE(SUM(Price),0)在MSSQL中不起作用。
答案 5 :(得分:4)
您可以使用
SELECT ISNULL(SUM(ISNULL(Price, 0)), 0)
。
我99%肯定会起作用。
答案 6 :(得分:1)
ORACLE / PLSQL:
NVL FUNCTION
SELECT NVL(SUM(Price), 0) AS TotalPrice
FROM Inventory
WHERE (DateAdded BETWEEN @StartDate AND @EndDate)
如果0
返回空值,则此SQL语句将返回SUM(Price)
。否则,它将返回SUM(Price)
值。
答案 7 :(得分:-5)
最简单的方法是在结果中添加零。
即
$A=($row['SUM'Price']+0);
echo $A;
希望这会有所帮助!!