2015-02-04 5 views
1

Это более любопытный вопрос. Я знаю, что этот вопрос кажется странным, но я использую null при проверке данных, потому что меня не интересуют, какие данные есть, но есть только данные IF. Я считаю, что следующий сценарий возникает только в SQL Server.COUNT (NULL) и IN IN

Когда я хочу увидеть, если запись существует, я буду использовать:

IF(EXISTS(SELECT null FROM Table1 WHERE Criteria IN (1, 2))) 

Следующий код работает:

IF((SELECT COUNT(null) FROM Table1 WHERE Criteria = 1) = 2) 

Но это не работает:

IF((SELECT COUNT(null) FROM Table1 WHERE Criteria IN (1,2)) = 2) 

и получите эту ошибку:

Operand data type NULL is invalid for count operator.

Почему третье утверждение отличается от предложения IN?

Вот SQL Скрипка, о чем я говорю: http://sqlfiddle.com/#!6/6d7db/8

сузил только если есть несколько элементов в предложении слишком

+0

Выполнение 'COUNT (NULL)' на самом деле ничего не делает для вас, например, 'COUNT (1)'. Я знаю, что это не ответ на вопрос, но что, если вы просто использовали 'COUNT (1)'? Допустимый синтаксис – Tom

+2

Или просто счет (*). Это одно из немногих мест, где использование * прекрасно. –

+0

Также внутри существует совершенно приемлемое использование select *. Все, что он делает, это проверка наличия строк. –

ответ

2

Это похоже на оптимизатор запросов.
В первых двух запросах (из вашей скрипки) count(null), кажется, преобразуется в COUNT(*), как вы можете видеть в плане выполнения.

enter image description here
Во второй строке, IN только с одним значением оптимизирована для =, в результате чего в том же запросе, как указано выше:

enter image description here

С IN (1,2) запрос терпит неудачу. Это то же самое, если вы используете COUNT(1): он преобразуется в COUNT(*), где запрос может возвращать только одну строку, но остается COUNT(1) в третьем.

Другое побочное устройство: эффект работает только с реальной таблицей.Если вы используете переменную таблицы, все три оператора выдают ошибку.

В нижней строке, вероятно, следует: count(null)неправильно (как объяснено Heinzi), он просто может проскальзывания через оптимизатор в очень редких случаях.

2

COUNT(null), короткая форма COUNT(ALL null), просто не имеет смысла. Давайте посмотрим at the definition of COUNT (курсив мой):

COUNT(*) returns the number of items in a group. This includes NULL values and duplicates.

COUNT(ALL expression) evaluates expression for each row in a group and returns the number of nonnull values.

COUNT(DISTINCT expression) evaluates expression for each row in a group and returns the number of unique, nonnull values.

Таким образом, COUNT(ALL someExpressionThatYieldsNull) бы всегда возвращаться 0, независимо от того, сколько записей соответствует вашим ИНЕКЕ. Очевидно, что это делает его совершенно непригодным для подсчета строк. COUNT(*) будет здесь.

Я очень удивлен, что ваш второй пример работает вообще, вы могли бы наткнуться на ошибку здесь. Попытка следующее MSSQL 2012 (SQLFiddle):

SELECT COUNT(NULL) FROM someTable; 

дает следующее сообщение об ошибке:

Operand data type NULL is invalid for count operator.

, что делает прекрасный смысл.