所以我前几天遇到了一些事情,试图在运行导入后计算多少空值。
所以,我做了:
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)
没有计算空值,但我想知道为什么空值不能用这种方法计算?
非常感谢, 詹姆斯。
答案 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值。如果我错了,请更正我。