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(
.
该sum()
功能自动忽略NULL
.要做你想做的事,你需要一个明确的checK:
select (case when count(foo) = count(*) then sum(foo) end)
from #tmp;
Run Code Online (Sandbox Code Playgroud)
如果要显式,可以添加else NULL
到case
语句中.
这背后的逻辑是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
.问题在于聚合函数,而不是算术运算符.
归档时间: |
|
查看次数: |
115 次 |
最近记录: |