Свойство функции Count с NULL в SQL Server

#sql-server #null

#sql-сервер #null

Вопрос:

  • Почему SELECT COUNT(1 NULL) возвращает 0 , хотя SELECT 1 NULL возвращает NULL
  • Относительно того, почему SELECT COUNT(NULL) возвращает сообщение об ошибке Operand data type void type is invalid for count operator , хотя SELECT NULL возвращает NULL

Требуется объяснение.

Комментарии:

1. Хороший вопрос, я думаю, вы можете начать с чтения этого: technet.microsoft.com/en-us/library/ms191504 (v=sql.105).aspx

Ответ №1:

Почему SELECT COUNT(1 NULL) возвращает 0, хотя SELECT 1 NULL возвращает NULL

Выполнение любой операции с NULL вернет NULL . Таким образом, 1 NULL вернет NULL . Select возвращает единственное значение (которое равно NULL), поскольку оно является результатом вычисления.

COUNT() работает по-разному в зависимости от того, что он считает. COUNT(*) возвращает мощность указанной таблицы, то есть количество строк. Однако поместите выражение в скобки и COUNT() устраните нули; 1 NULL равно NULL, поэтому COUNT(1 NULL) исключает одно указанное вами значение и возвращает 0.

Относительно того, почему SELECT COUNT(NULL) возвращает сообщение об ошибке Тип данных операнда тип void недопустим для оператора count, даже если SELECT NULL возвращает NULL .

NULL не имеет неявного типа, поэтому COUNT() не знает, как с ним обращаться, и выдает ошибку.

Ответ №2:

1 null есть null , но count() совокупные подсчеты не равны нулю, это не похоже на сумму. ваш пример выглядит Sum(1 null) так : = null

см. : SELECT SUM(1 NULL),COUNT(1 NULL)

Ответ №3:

Если мы выполним любую арифметическую операцию с NULL, результатом будет NULL . Итак, нам нужно преобразовать это нулевое значение во что-то и можем выполнить операцию.

Смотрите Эту ссылку Nulls и агрегатные функции

Комментарии:

1. Хорошие демонстрации между нулевыми и агрегатными функциями

Ответ №4:

Форма COUNT() агрегатной функции COUNT возвращает количество всех ненулевых значений. Это описано в онлайн-книгах по SQL Server (http://msdn.microsoft.com/en-us/library/ms175997.aspx ): «вычисляет выражение для каждой строки в группе и возвращает количество ненулевых значений». В вашем первом примере передается одно нулевое значение, поэтому результирующее значение равно нулю.

Что касается ошибки «тип данных операнда void», сообщение об ошибке более четкое в SQL Server 2012 и более поздних версиях. В версиях после SQL Server 2008 R2 вы получите сообщение «тип данных операнда NULL недопустим для оператора count». из-за неизвестного типа данных. Поведение отличается, когда нетипизированное нулевое выражение возвращается непосредственно оператором SELECT . В этом случае SQL Server неявно использует тип данных int для метаданных выражения.