Почему isnull (<field>, 0) соответствует NULL в операторе SQL? - PullRequest
1 голос
/ 17 октября 2011

В SQL Server 2008 я запускаю следующий SQL:

SELECT id, old_tgt_price, new_tgt_price 
FROM inst i 
WHERE inst_id IN (281, 229) 
AND is_latest = 1

со следующим результатом:

id          old_tgt_price   new_tgt_price
4492        462             NULL
4487        2700            2500

В этом нет ничего плохого.Если я добавлю проверку, что старая и новая цена не равны (хотя ожидаем, что некоторые значения равны NULL):

SELECT id, old_tgt_price, new_tgt_price 
FROM inst i 
WHERE inst_id IN (281, 229) 
AND is_latest = 1 
AND (isnull(old_tgt_price, 0) != isnull(new_tgt_price, 0))

, я получу одинаковый результат.Для записи с идентификатором 4492 условие AND (isnull (old_tgt_price, 0)! = Isnull (new_tgt_price, 0))) обязательно должно завершиться неудачей.

Почему запись 4492 по-прежнему возвращается во втором наборе результатов?

Ответы [ 2 ]

2 голосов
/ 17 октября 2011

Оператор, добавленный внизу, говорит, что выберите эту строку, если old_tgt_price! = new_tgt_price и меняет их обоих на 0, если они нулевые. old_tgt_price не равно нулю, поэтому его значение равно 462. new_tgt_price равно нулю, поэтому оно получает значение 0. Они не равны, поэтому выводит результат.

Что ты пытаешься сделать? Вы не хотите, чтобы он печатал нулевые результаты?

0 голосов
/ 17 октября 2011

Ваш null будет изменен на 0, поэтому ваше состояние будет выглядеть следующим образом: 462! = 0, что TRUE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...