具有聚合函数的ISNULL

时间:2017-10-26 14:11:08

标签: sql aggregate-functions

将这两者结合使用的最佳方法是什么?在我的情况下,如果用户ID是null,我想返回零,并且用户可以拥有多个ID,因此我们希望获得最低(原始)ID。

ISNULL(MIN(UserId),0)

或者,

MIN(ISNULL(UserId),0)

谢谢。

答案是否表明所有综合功能?

3 个答案:

答案 0 :(得分:3)

这些陈述不一定产生相同的输出:

  • 第一个采用存在的最小值,仅当它为null时,使用0。
  • 第二个检查每个用户id,如果为null,则使用0 - 然后取最小值(除非用户ID可以是负数,用户使用5和null,将输出0)

快速脚本可以证明这一点:

with testData as (
  select 1 as SomeKey, 5 as userID
  union all 
  select 1 as SomeKey, null as userID
  union all
  select 2 as SomeKey, 6 as userID
  union all 
  select 2 as SomeKey, 5 as userID
)
select
  somekey
  , isnull(min(userid),0) as firstScenario
  , min(isnull(userid,0)) as SecondScenario
from testdata
group by somekey

结果:

Somekey    firstScenario    secondScenario
1          5                0
2          5                5

第一种情况是你最有可能发生的一种情况,但问题的措辞使得对于所期望的行为有点模棱两可。

http://sqlfiddle.com/#!6/9eecb7db59d16c80417c72d1e1f4fbf1/10170

答案 1 :(得分:2)

这取决于你想做什么。但我偏向于COALESCE(),因为它是ANSI标准函数。

您的两个选择是:

COALESCE(MIN(UserId), 0)
MIN(COALESCE(UserId, 0))

这些不做同样的事情。第一个返回最小用户ID。如果所有用户ID均为NULL,则此表达式将返回0

第二个用NULL替换每个0。假设用户ID为正数,则如果任何用户ID为0,则返回NULL

根据我对你的逻辑的理解,你需要第二个版本。

答案 2 :(得分:0)

我想你使用SQL Server,因为ISNULL是一个T-Sql函数。

要在DBMS中使用功能,您可以使用COALESCE

MIN函数中不包含

NULL个值。

所以如果你想阻止NULL结果,我建议你使用第一个解决方案

ISNULL(MIN(UserId), 0)