Значения NULL в предложении where
у меня есть таблица "бла" вроде этого:
[id] [name] [fk]
1 test 4
2 foo 5
3 bar NULL
Если я сделаю sql-запрос
SELECT * FROM bla WHERE fk <> 4
Я получаю только записи с id 2. я не получаю запись с id 3, где fk равен null. Я думал, ноль != 4. Кажется, это неправильно.
почему это так?
6 ответов
NULL
не сравнивается ни с чем. Вам нужно будет принять nulls явно:
where fk <> 4 or fk is null;
посмотреть работа с NULL подробнее о NULL
работа.
, потому что NULL
расшифровывается как UNKNOWN
, и когда вы сравниваете значение с UNKNOWN
, результат всегда будет false.
взгляните на это сравнение -
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;
для получения дополнительной информации см. раздел Википедия.
NULL
является особенным в том, что он представляет собой "неизвестное" значение. Это нельзя сравнить с числами (или любым другим значением, если на то пошло), следовательно, результат -
Is NULL
4? Ответ - не знаю. 4 отличается от неизвестного значения?
попробуйте это вместо этого:
SELECT * FROM bla WHERE fk <> 4 OR FK IS NULL
NULL-это не значение, а скорее неизвестное отсутствие значения. Если вы хотите проверить значение NULL, вы должны сделать это явно, используя IS NULL
и IS NOT NULL
. Например, NULL будет тестировать FALSE даже против самого NULL. Итак,работа с NULL выполняется только с вышеупомянутыми функциями (и ISNULL()
). Ваш запрос может быть переписан как
SELECT * FROM bla WHERE fk <> 4 OR fk IS NULL
как о
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