为什么不在COUNT(列名)中计算空值

时间:2014-10-14 19:28:23

标签: sql sql-server count null

所以我前几天遇到了一些事情,试图在运行导入后计算多少空值。

所以,我做了:

select COUNT(columnname) from table 
WHERE ColumnName is null

没有计算空值......

然后我做了,

select COUNT(*) from table 
WHERE ColumnName is null

这给了我数数。

所以,让我烦恼的是为什么这并不能算出空值。

我已经看过这个问题(以及围绕谷歌进行的良好搜索......): In SQL, what's the difference between count(column) and count(*)?, 虽然它告诉我COUNT(columnname)没有计算空值,但我想知道为什么空值不能用这种方法计算?

非常感谢, 詹姆斯。

6 个答案:

答案 0 :(得分:9)

COUNT计算值,因为null不是一个不计算的值。

如果要计算所有空值,可以执行以下操作:

SELECT COUNT(ID) as NotNull, SUM(CASE WHEN ID IS NULL then 1 else 0 end) as NullCount

答案 1 :(得分:5)

为什么COUNT(columnname)中没有计算空值?

COUNT(*)

将计算所有行

COUNT(columnname)

将计算所有行,但列名为IS NULL的行除外。

原因是什么? 只是COUNT()函数被设计为以这种方式工作:NULL值与其他值的处理方式不同,因为NULL可以被视为占位符" unknown"值,因此您只想计算具有实际值的行并跳过不具有的行,这是很常见的。

对没有值的行进行计数不太常见,SQL也没有为它提供函数。但你可以很容易地计算出来:

SELECT
  COUNT(*) As rows,
  COUNT(columnname) AS non_null_count,
  COUNT(*) - COUNT(columnname) AS null_count
FROM
  yourtable

答案 2 :(得分:2)

如果您改为计数(1),您将不会受到此过滤器的影响。

答案 3 :(得分:1)

COUNT仅计算实数值... null不是值。所以:

当您想要包含无效值时,会使用

COUNT(*)。

如果您只想计算非无效值的数量,可以使用COUNT(列名)

答案 4 :(得分:0)

我不确定开销是否是一个问题,但它发生在我身上,为什么要数(*)?你可以简单地计算你知道肯定会有数据的任何字段(例如ID字段)并添加WHERE(columnName IS NULL)。

从yourTable中选择count(ID)为NullCount,其中columnName为null

答案 5 :(得分:0)

正如@Jeffrey Wieder在他的回答中提到的,count计数实际值,而null不是值,它将忽略它们。但是,如果您要计算一列的所有行(包括空值),则可以-

Select count(column_name isnull) from table_name

这是在PostgreSQL中。如果有人可以进一步阐明其工作原理,那将是很棒的。我的理解是,在count内部提及“ is null”会使它甚至计算null值。如果我错了,请更正我。