Значения NULL в предложении where - PullRequest
10 голосов
/ 26 июля 2011

У меня есть таблица "бла", как это:

[id]    [name]    [fk]
1       test      4
2       foo       5
3       bar       NULL

, если я делаю SQL-запрос

SELECT * FROM bla WHERE fk <> 4

, я получаю запись только с идентификатором 2. яне получите запись с идентификатором 3, где fk равно нулю.Я думал NULL! = 4. Кажется, что это неправильно.

Почему это так?

Ответы [ 6 ]

29 голосов
/ 26 июля 2011

NULL не сравнить ни с чем. Вам нужно будет явно принимать значения NULL:

where fk <> 4 or fk is null;

См. Работа с NULL для получения дополнительной информации об обработке NULL.

4 голосов
/ 26 июля 2011

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

Посмотрите на это сравнение -

NULL = NULL    -- false, since both are unknown, so the truth value of this expression can't be determined.
NULL = 4       -- false
4 = 4          -- true, since both values are known.

Если вы хотите получить записи, содержащие NULL, вам нужно переписать ваш запрос следующим образом -

where fk <> 4
OR fk is null;

Для получения дополнительной информации см. Википедия .

2 голосов
/ 26 июля 2011

NULL - это не значение, а неизвестное отсутствие значения. Если вы хотите проверить на NULL, вы должны сделать это явно, используя IS NULL и IS NOT NULL. Например, NULL будет проверять FALSE даже против самого NULL. Итак, работа с NULL выполняется только с вышеупомянутыми функциями (и ISNULL()). Ваш запрос может быть переписан как

SELECT * FROM bla WHERE fk <> 4 OR fk IS NULL
2 голосов
/ 26 июля 2011

NULL отличается тем, что представляет «неизвестное» значение.Это нельзя сравнить с числами (или любым другим значением в этом отношении), следовательно, результат -

Is NULL <> 4?Ответ - не знаю.4 отличается от неизвестного значения?

Попробуйте вместо этого:

SELECT * FROM bla WHERE fk <> 4 OR FK IS NULL
0 голосов
/ 12 декабря 2016

Следующее утверждение должно помочь:

ВЫБРАТЬ * ОТ БЛА ГДЕ КОЛЕСС (fk, 0) <> 4

0 голосов
/ 26 июля 2011

Как насчет

SELECT * FROM bla WHERE NOT (fk = 4)

Логика:

NULL = 4 --false
5 = 4    --false
4 = 4    --true

NOT (NULL = 4) --true
NOT (5 = 4)    --true
NOT (4 = 4)    --false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...