Условие <> 0 будет считать Null & 0 одинаковыми в SQL - PullRequest
1 голос
/ 19 июня 2019

Мне нужно сравнить переменную в случае, если в хранимой процедуре.

case when @column <> 0 then ...
     ELSE 0 END

но когда я получаю @column как NULL, то приведенный выше скрипт возвращается как 0.

будет считать оба 0 и NULL одинаковыми.

Использую sql server 2014.

Спасибо всем

Ответы [ 2 ]

4 голосов
/ 19 июня 2019

Нет.SQL считает NULL «я понятия не имею».Сравнение чего-либо с «Я понятия не имею» приводит к ответу «Я совершенно не знаю».Смотри:

- Как высоко Джон?
- Понятия не имею.
- Что на два сантиметра выше Джона?
- Понятия не имею.

Даже сравнение между двумя NULL значениями неверно: если я не знаю, какой у Джона рост, и если я также не знаю, какой рост у Джека, я не могу сделать выводчто Джон такой же высокий, как Джек (и я не могу сделать вывод, что Джон не такой же высокий, как Джек).Единственный разумный ответ ... «Я понятия не имею».

Способ проверки на NULL - с помощью оператора IS, который специально существует для этого сценария (например, @column IS NULL или @column IS NOT NULL).

То есть NULL не равно 0 и НЕ равно 0.Результат NULL <> 0 равен NULL.Тем не менее, NULL ложно в отношении условий, поэтому CASE считает, что вы должны получить ветку ELSE в любое время @column равно NULL.

0 голосов
/ 19 июня 2019

В случае, если вы хотите выполнить then часть case, если значение column равно null, измените ваше состояние, чтобы проверить, что nulls также

CASE WHEN (@column <> 0 OR @column IS NULL) then ...
     ELSE 0 END
...