首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当元素为NULL时,将聚合函数更改为输出NULL

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

Stack Overflow用户
提问于 2014-03-03 21:46:56
回答 3查看 144关注 0票数 2

我搜索到的每一个关于警告的问题

警告: Null值由聚合操作或其他设置操作消除。

通常,人们希望将空值视为0。相反,如何修改以下存储过程,使其返回NULL而不是1?

代码语言:javascript
复制
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(的行为。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-03 21:52:51

sum()函数自动忽略NULL。要做您想做的事情,您需要一个显式的checK:

代码语言:javascript
复制
select (case when count(foo) = count(*) then sum(foo) end)
from #tmp;

如果要显式,可以将else NULL添加到case语句中。

这背后的逻辑是count(foo)foo中计数非空值的数量。如果这等于所有行,那么所有的值都是非空的。您可以使用更详细的:

代码语言:javascript
复制
select (case when sum(case when foo is null then 1 else 0 end) > 0
             then sum(foo)
        end)

而且,我想指出,这个标题是相当误导人的。1 + NULL = NULL。问题在于聚合函数,而不是算术运算符。

票数 6
EN

Stack Overflow用户

发布于 2014-03-03 21:57:01

使用EXISTS查找空值可能是最快的:

代码语言:javascript
复制
SELECT
    CASE WHEN EXISTS(SELECT NULL FROM tmp WHERE foo IS NULL)
        THEN NULL
        ELSE (SELECT sum(foo) from tmp)
    END
票数 2
EN

Stack Overflow用户

发布于 2014-03-03 22:01:42

只管说

代码语言:javascript
复制
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
 ...

这就是你所需要的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22158154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档