Почему в COUNT (имя столбца) не учитываются нули

4 James Hatton [2014-10-14 22:28:00]

Итак, я наткнулся на что-то на днях на работе, пытаясь подсчитать количество нулевых значений после запуска импорта.

Итак, я сделал:

select COUNT(columnname) from table 
WHERE ColumnName is null

Который не считал нули...

Тогда я сделал,

select COUNT(*) from table 
WHERE ColumnName is null

Который дал мне счет.

Итак, что-то, что меня беспокоило, почему именно это не учитывает нулевые значения.

Я рассмотрел этот вопрос (наряду с хорошим поиском в Google...): В SQL, какая разница между count (column) и count (*)?, и пока он говорит мне, что COUNT(columnname) не учитывает нули, я хотел бы точно знать , почему nulls не учитываются с помощью этого метода?

Большое спасибо, Джеймс.

null sql sql-server count


6 ответов


8 Решение Jeffrey Wieder [2014-10-14 22:32:00]

COUNT подсчитывает значения, поскольку значение null не является значением, которое не подсчитывается.

Если вы хотите подсчитать все нулевые значения, вы можете сделать что-то вроде этого:

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

5 fthiella [2014-10-14 23:00:00]

Почему в COUNT(columnname) не учитываются нули??

COUNT(*)

будет считать все строки

COUNT(columnname)

будет считать все строки, за исключением тех строк, где columnname IS NULL.

И какая причина? Это просто, что функция COUNT() предназначена для работы таким образом: значения NULL обрабатываются иначе, чем другие значения, потому что NULL можно считать заполнитель для "неизвестных" значений, поэтому очень часто вы хотите просто подсчитать строки которые имеют реальное значение и пропускают строки, которые не имеют.

Подсчет строк, которые не имеют значения, встречается реже, а SQL не предоставляет для него функции. Но вы можете легко вычислить его:

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

2 Jonny Axelsson [2014-10-14 22:46:00]

Если вы вместо этого считаете (1), вы не будете подвержены этому фильтру, что считать в состоянии.


1 Hard Tacos [2014-10-14 22:34:00]

COUNT подсчитывает только реальные значения... null не является значением. Итак:

COUNT (*) используется, если вы хотите включить значения, не имеющие значения.

Если вы хотите просто подсчитать количество не нулевых значений, вы должны использовать COUNT (имя столбца)


0 Siddharth Jain [2019-01-26 04:53:00]

Как отметил в своем ответе @Jeffrey Wieder, count считает фактические значения и, поскольку null не являются значениями, он игнорирует их. Но если вы хотите посчитать все строки для столбца, включая нулевые значения, вы можете сделать -

Select count(column_name isnull) from table_name

Это в PostgreSQL. Если кто-нибудь может пролить больше света на то, почему это работает, это было бы здорово. Насколько я понимаю, упоминание "пусто" в подсчете заставляет считать даже нулевые значения. Пожалуйста, исправьте меня, если я ошибаюсь.


0 R Loomas [2017-04-04 15:43:00]

Я не уверен, что накладные расходы вызывает беспокойство, но это происходит со мной, почему count (*)? Вы можете просто подсчитать любое поле, где вы точно знаете, что будут данные (например, поле ID) и добавить WHERE (columnName IS NULL).

выберите count (ID) как NullCount из вашей таблицы, где columnName имеет значение null