#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 для метаданных выражения.