当元素为NULL时,将聚合函数更改为输出NULL

Sco*_*ain 2 sql sql-server null stored-procedures sql-server-2012

我搜索有关警告的每个问题

警告:聚合或其他SET操作消除了空值.

通常人们希望将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
Run Code Online (Sandbox Code Playgroud)

我以为它会SET ANSI_NULLS ON(我在声明之前尝试,在程序本身内,在我的测试查询中执行程序之前)但是这似乎没有改变行为SUM(.

Gor*_*off 6

sum()功能自动忽略NULL.要做你想做的事,你需要一个明确的checK:

select (case when count(foo) = count(*) then sum(foo) end)
from #tmp;
Run Code Online (Sandbox Code Playgroud)

如果要显式,可以添加else NULLcase语句中.

这背后的逻辑是count(foo)计算非NULL值的数量foo.如果这等于所有行,则所有值都是非NULL.你可以使用更详细的:

select (case when sum(case when foo is null then 1 else 0 end) > 0
             then sum(foo)
        end)
Run Code Online (Sandbox Code Playgroud)

并且,我想指出标题是非常误导的. 1 + NULL = NULL.问题在于聚合函数,而不是算术运算符.

  • @DStanley...我对此表示怀疑.无论如何,查询必须进行聚合,因此添加一个连接("存在"隐式执行)似乎不会加速它.当然,OP可以尝试,但我可能错了,但那是我的直觉. (2认同)