目的未知的SQL

时间:2010-12-10 15:49:39

标签: sql-server sql-server-2005 tsql

我必须更改由另一个人完成的一些SQL查询(SQL Server 2005),并且在该代码中我经常看到以下结构:

SELECT fieldA, SUM(CASE fieldB  WHEN null THEN 0  ELSE fieldB END) as AliasName FROM ...

我不理解case语句,因为据我所知,在一个case中无法检查null,因此我认为上面的代码与:

SELECT fieldA, SUM(fieldB) as AliasName FROM ...

我也做了一些测试,结果没有看到任何差异。我错过了什么,或者我可以通过简短的语句替换上层语句吗?

更新

仅为了完整性,因为答案中没有提到:上面的代码返回与下面的相同的结果。使用的case构造不会将零替换为零,因此可以省略它。如果原始sql的目的是确保将返回never null,则可以使用coalesceisnull - 运算符(如答案中所述)。

2 个答案:

答案 0 :(得分:4)

第二个语句的输出将包含nulls(当汇总具有null fieldB值的记录时。如果你不介意的话,你没问题。

如果您想在输出中使用零而不是null值,请使用:

select fieldA, sum(isnull(fieldB, 0)) as AliasName from ...

答案 1 :(得分:1)

使用

可以更容易实现这一目标
SELECT fieldA, COALESCE(fieldB, 0) as AliasName