我搜索到的每一个关于警告的问题
警告: Null值由聚合操作或其他设置操作消除。
通常,人们希望将空值视为0。相反,如何修改以下存储过程,使其返回NULL而不是1?
CREATE PROCEDURE TestProcedure
AS
BEGIN
select cast(null as int) as foo into #tmp
insert into #tmp values (1)
select sum(foo) from #tmp
END
GO我认为应该是SET ANSI_NULLS ON (我在声明之前、在过程本身以及在执行测试查询中的过程之前都试过了),但这似乎并没有改变SUM(的行为。
发布于 2014-03-03 21:52:51
sum()函数自动忽略NULL。要做您想做的事情,您需要一个显式的checK:
select (case when count(foo) = count(*) then sum(foo) end)
from #tmp;如果要显式,可以将else NULL添加到case语句中。
这背后的逻辑是count(foo)在foo中计数非空值的数量。如果这等于所有行,那么所有的值都是非空的。您可以使用更详细的:
select (case when sum(case when foo is null then 1 else 0 end) > 0
then sum(foo)
end)而且,我想指出,这个标题是相当误导人的。1 + NULL = NULL。问题在于聚合函数,而不是算术运算符。
发布于 2014-03-03 21:57:01
使用EXISTS查找空值可能是最快的:
SELECT
CASE WHEN EXISTS(SELECT NULL FROM tmp WHERE foo IS NULL)
THEN NULL
ELSE (SELECT sum(foo) from tmp)
END发布于 2014-03-03 22:01:42
只管说
select case sign(sum(case when foo is null then 1 else 0 end))
when 1 then null
else sum(foo)
end
from some_table
...
group by
...这就是你所需要的。
https://stackoverflow.com/questions/22158154
复制相似问题