从 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?
Oracle/SQL:将日期和时间连接成单个日期值时的数字格式模型无效