Это не работает так, как вы ожидаете, так как расширяется до множества операций равных
fiStatusNew = NULL OR fiStatusNew = 1 OR fiStatusNew = 7 OR fiStatusNew = 8
и anything = NULL
неизвестно.
Учитывая это расширение, нет особой причины полагать, что добавление дополнительного OR
с использованием IS NULL
само по себе замедлит работу (дополнительный предикат может изменить план запроса на использование другого пути доступа, если статистика приведет его полагать, что число совпадающих строк оправдывает это)
Вы видите то же поведение в операции CASE
SELECT CASE NULL WHEN NULL THEN 'Yes' ELSE 'No' END /*Returns "No"*/
Это одна из причин, по которой вам следует проявлять особую осторожность при выполнении обратной операции NOT IN
. Если список содержит какие-либо значения NULL
, вы всегда получите пустой набор результатов.
fiStatusNew NOT IN (NULL, 1,2)
Расширится до
fiStatusNew<> NULL and fiStatusNew<> 1 and fiStatusNew<> 2
или
Unknown And True/False/Unknown And True/False/Unknown
, который всегда оценивается как Unknown
при трехзначной логике .