我的Select SUM查询返回null.它应该返回0

nec*_*tso 38 sql sql-server

我正在尝试使用以下查询来总结客户余额:

select sum(balance) from mytable where customer = 'john' 
Run Code Online (Sandbox Code Playgroud)

但是,如果客户没有余额(即mytable表中没有匹配的行),我的查询返回null而不是0.问题是什么?

alw*_*NET 85

试试这个:

select COALESCE(sum(balance),0) from mytable where customer = 'john' 
Run Code Online (Sandbox Code Playgroud)

这应该做的工作.coalesce方法应该返回0.

  • COALESCE在这里好多了 (4认同)
  • 应该使用 COALESCE 的原因是: 1) ISNULL 是非标准的,而 COALESCE 是。2) COALESCE 支持多个输入,而 ISNULL 仅支持 2 个输入。3) 当使用 SELECT INTO 构造时,如果你有一列定义为 `COALESCE(col1, 0) AS newcol1` - 如果源属性 `col1` 被定义为允许 NULL,`newcol1` 也将允许 NULL,如果你有 ` ISNULL(col1, 0) AS newcol1` 它将创建一个不允许 NULL 的属性 4) 输出的 `COALESCE` 类型将与返回元素的类型相同,`ISNULL` 将返回第一个论点 (3认同)
  • 至于原因 4. 根据我之前的评论,请考虑以下示例以了解为什么 COALESCE 可能更合适:`DECLARE @x AS VARCHAR(3) = NULL,@y AS VARCHAR(10) = '1234567890'; SELECT COALESCE(@x, @y) AS [COALESCE], ISNULL(@x, @y) AS [ISNULL]` 这个样本之前的一些样本取自`Training Kit (Exam 70-461): Querying Microsoft SQL Server 2012` 由 Itzik Ben-Gan、Dejan Sarka、Ron Talmage 撰写。 (3认同)

And*_*mar 14

那不是问题.如果没有行,sum()将返回null.null如果所有行都有null余额,它也会返回.

要返回零,请尝试:

select isnull(sum(balance),0) from mytable where customer = 'john' 
Run Code Online (Sandbox Code Playgroud)

  • 如果其中一行具有"null"余额,它也将返回"null" (2认同)

Dav*_*shi 5

select coalesce(sum(coalesce(balance,0)),0) from mytable where customer = 'john' 
Run Code Online (Sandbox Code Playgroud)