SQL 2008. Оператор <> и значение NULL
От: blonduser  
Дата: 19.03.16 06:47
Оценка:
Всем доброго времени суток!

Вывожу из таблицы значения по условию "Column1" <> "ValueX".
В выходной набор данных не попадают значения "Column1" IS NULL, хотя по логике должны.
Решение с дополнительным условием: ("Column1" <> "ValueX" OR "Column1" IS NULL).

Можно ли вывести и эти значения без дополнительного условия?

Спасибо.
Re: SQL 2008. Оператор <> и значение NULL
От: _ABC_  
Дата: 19.03.16 07:19
Оценка: 2 (1)
Здравствуйте, blonduser, Вы писали:

B>Вывожу из таблицы значения по условию "Column1" <> "ValueX".

B>В выходной набор данных не попадают значения "Column1" IS NULL, хотя по логике должны.
По логике не должны. Вы неправильно понимаете что такое NULL.
NULL — это не значение, это отсутствие каких-либо данных о значении.
Поэтому
'value' <> NULL

выдает не true, а unknown.
Т.к. результат сравнения не true, то строка в выборку не попадает.

Обойти это нельзя. Точнее можно чем-нибудь вроде
isnull(column1, 'valueNotX') <> 'valueX'

но вряд ли план выполнения при этом будет лучше, чем с доп. условием.
Re[2]: SQL 2008. Оператор <> и значение NULL
От: LuciferNovoros Россия  
Дата: 19.03.16 07:53
Оценка:
Здравствуйте, _ABC_, Вы писали:

_AB>Обойти это нельзя. Точнее можно чем-нибудь вроде

_AB>
_AB>isnull(column1, 'valueNotX') <> 'valueX'
_AB>

_AB>но вряд ли план выполнения при этом будет лучше, чем с доп. условием.

Если построить индекс, то хуже план не станет. Но есть другое: всегда найдется такое ValueX, которое напрочь поломает результат выборки. Да и лишний индекс иногда критичен бывает, если много изменений в таблицу пишется.
Re: SQL 2008. Оператор <> и значение NULL
От: wildwind Россия  
Дата: 19.03.16 08:58
Оценка:
Здравствуйте, blonduser, Вы писали:

B>В выходной набор данных не попадают значения "Column1" IS NULL, хотя по логике должны.


Не должны. X op NULL === NULL, где op — любая операция сравнения.
Re[3]: SQL 2008. Оператор <> и значение NULL
От: Win32nipuh  
Дата: 24.03.16 10:36
Оценка: +1
Здравствуйте, LuciferNovoros, Вы писали:

LN>Здравствуйте, _ABC_, Вы писали:


_AB>>Обойти это нельзя. Точнее можно чем-нибудь вроде

_AB>>
_AB>>isnull(column1, 'valueNotX') <> 'valueX'
_AB>>

_AB>>но вряд ли план выполнения при этом будет лучше, чем с доп. условием.

LN>Если построить индекс, то хуже план не станет. Но есть другое: всегда найдется такое ValueX, которое напрочь поломает результат выборки. Да и лишний индекс иногда критичен бывает, если много изменений в таблицу пишется.



Filtered Index по IS NOT NULL и в выборку включить условие
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.