我的COUNT CASE WHEN语句中是否隐含了ELSE 0?

COUNT(CASE WHEN [Column A] = ____ THEN 1 ENDCOUNT(CASE WHEN [Column A] = ____ THEN 1 ELSE 0 END之间有何区别?

我一直在使用前者,到目前为止还没有看到区别;添加ELSE 0的原因是什么 - 是否存在SQL Server错误计数的情况?


4第二个例子应该使用SUM而不是COUNT才能正确。 - Olivier Jacot-Descombes
2个回答

在第一种情况下,你只是简单地计算1和NULL的数量。(如果CASE语句中的条件都不匹配且没有ELSE子句,则返回NULL。)NULL不会被计算在内。而在第二种情况下,你要计算1和0的数量。0可以被计算在内。 快速示例:
CREATE TABLE #CountMe (Col1 char(1));

INSERT INTO #CountMe VALUES ('A');
INSERT INTO #CountMe VALUES ('B');
INSERT INTO #CountMe VALUES ('A');
INSERT INTO #CountMe VALUES ('B');

SELECT
    COUNT(CASE WHEN Col1 = 'A' THEN 1 END) AS CountWithoutElse,
    COUNT(CASE WHEN Col1 = 'A' THEN 1 ELSE NULL END) AS CountWithElseNull,
    COUNT(CASE WHEN Col1 = 'A' THEN 1 ELSE 0 END) AS CountWithElseZero
FROM #CountMe;

输出:

enter image description here


如果您在case语句中没有指定else部分,它将默认返回NULL,在您的情况下这是一件好事,因为count函数将计算非NULL值。如果您从case语句中返回其他任何值,无论是1、0还是2,它都将被视为1进行计数。 如果您使用sum函数而不是count函数,那么您应该返回1或0。