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 次 |
| 最近记录: |