Значения 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

следующее заявление должно помочь:

выберите * из bla, где COALESCE (fk,0) 4