Оператор Not In исключает строки значений NULL в таблице - PullRequest
2 голосов
/ 31 мая 2019

Я хотел бы получить все строки со значениями, кроме 1,2,3,4,5, в моей COLUMNA в TABLEA.

SELECT * FROM TABLEA WHERE COLUMNA NOT IN (1,2,3,4,5)

Но это также исключает строки со значениями NULL в COLUMNA.

Я не хочу исключать строки значений NULL и хотел бы включить эти строки в набор результатов.

В качестве альтернативы, я могу попробовать запрос ниже для того же

SELECT * FROM TABLEA WHERE COLUMNA NOT IN (1,2,3,4,5) OR COLUMNA  IS NULL.

Но я хотел бы знать, почему необходимо добавить это условие ИЛИ?

Ответы [ 2 ]

5 голосов
/ 31 мая 2019

Зачем нужно дополнительное?

NULL сравнения почти всегда приводят к NULL, а не к истине или ложи. Предложение WHERE отфильтровывает все неверные значения, поэтому они отфильтровываются.

Так SQL определяет NULL. Почему NULL определяется так?

NULL не означает «отсутствует» в SQL. Это означает «неизвестно». Таким образом, результат <unknown> not in (1, 2, 3, 4, 5) является «неизвестным», потому что значение может быть 1 или 0. Следовательно, оно фильтруется.

Также отмечу, что стандарт SQL включает NULL -безопасные сравнения, IS NOT DISTINCT FROM и IS DISTINCT FROM, соответствующие = и <> соответственно. Они обрабатывают NULL как просто «любое другое значение», поэтому два значения NULL считаются равными. Однако, насколько я знаю, для NULL -safe IN и NOT IN нет конструкции.

2 голосов
/ 31 мая 2019

Попробуйте выполнить следующее:

ВЫБРАТЬ * ИЗ ТАБЛИЦЫ, ГДЕ НУЛЯЕТСЯ (КОЛУМНА, 0), НЕ ВХОДЯЩИЙ (1,2,3,4,5)

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