Почему (Col <> значение AND Col равно null) не возвращает нулевые значения? - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть приложение, в котором пользователи могут выбирать различные параметры на странице, а указанный код создает запрос SQL для возврата соответствующих записей.

В этом случае пользователь выбрал:

  • Division! = '1'

Существует также автоматическое ограничение, в котором деление возвращаемых записей должно быть в UserDivisions, которое представляет собой переменную, которая выглядит как

Division IS NULL OR Division IN ('1','1.1','1.1.1')

Таким образом, возвращаемые записи должны находиться в одном из перечисленных подразделений или иметь значение NULL в качестве значения.

Мой код в настоящее время обрабатывает эти ограничения отдельно, поэтому окончательный SQL выглядит как

Select top 1000 Division, WoNum, WoType 
From WorkOrder
Where (Division IS NULL OR Division IN ('1','1.1','1.1.1'))
AND (Division <> '1')

Этот запрос возвращает все записи с Division = '1.1' и '1.1.1', и он не возвращает ничего в Division '1', как должно, но он также не возвращает никаких записейс Division = Null.

Как мне построить этот запрос, чтобы он также возвращал NULL, и почему указанный выше запрос не возвращает NULL?

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

and (Division <> '1') удаляет нули.Это потому, что значение null не может быть оценено как <> '1'.СУБД возвращает «неопределенное».Undefined не соответствует действительности и исключается.

Вы можете сделать это вместо этого;но это кажется странным, поскольку вы хотите разделить 1, а затем исключить его.

WHERE ((Division IN ('1','1.1','1.1.1') AND (Division <> '1')) OR Division IS NULL)

0 голосов
/ 05 апреля 2019

Когда вы сравниваете значение NULL со значением, оно всегда возвращает неопределенное значение

..., которое не соответствует истине и, следовательно, оценивается как ложное.Таким образом, AND (Division <> '1') удалит все значения NULL из возвращаемого набора.

Некоторые способы выполнить тот же запрос, но включают пустые значения:

  • Where (Division IS NULL OR Division IN ('1','1.1','1.1.1')) AND (Division <> '1' OR Division IS NULL)

  • WHERE ((Division IN ('1','1.1','1.1.1') AND (Division <> '1')) OR Division IS NULL)

  • WHERE (ISNULL(Division,'') <> '1') AND (Division IS NULL OR Division IN ('1','1.1','1.1.1'))

  • WHERE (COALESCE(Division,'') <> '1') AND (Division IS NULL OR Division IN ('1','1.1','1.1.1'))

, что функционально эквивалентно

  • WHERE (CASE WHEN Division IS NULL THEN '' ELSE Division END) <> '1' AND (Division IS NULL OR Division IN ('1','1.1','1.1.1'))
...