Привет.
В SQL-запросах все хорошо до тех пор пока не попадается значение NULL. Значение NULL или просто Нет Данных.
Основная особенность NULL-а заключается в том, что он не равен ничему, даже другому NULLу. С ним нельзя сравнить какое-либо значение с помощью любых операторов: =, <, >, like… Даже выражение NULL != NULL не будет истинным, ведь нельзя однозначно сравнить одну неизвестность с другой. Кстати, ложным это выражение тоже не будет, потому что при вычислении условий Oracle, например, не ограничивается состояниями ИСТИНА и ЛОЖЬ. Из-за наличия элемента неопределённости в виде NULLа существует ещё одно состояние - НЕИЗВЕСТНО. Красота, а вы думали что логика это только черное или белое?)
Сравнение с NULLом.
Существуют специальные операторы IS NULL и IS NOT NULL, которые позволяют производить сравнения с NULL-ами. IS NULL вернёт истину, если операнд имеет значение NULL и ложь, если он им не является.
Соответственно, IS NOT NULL действует наоборот: вернёт истину, если значение операнда отлично от NULL-а и ложь, если он является NULL-ом.
Кроме того, есть пара исключений из правил, касающихся сравнений с отсутствующими значениями. Во-первых, это функция DECODE, которая считает два NULL-а эквивалентными друг другу. Во-вторых, это составные индексы: если два ключа содержат пустые поля, но все их непустые поля равны, то Oracle считает эти два ключа эквивалентными.
Оператор NVL(value, new_value) помогает явно бороться с неизвестностью. Если value есть NULL, то возвращаемый результат будет new_value. Например NVL(NULL, 0) вернет 0.
Логические операции и NULL.
Обычно, состояние НЕИЗВЕСТНО обрабатывается так же, как ЛОЖЬ. Например, если вы выбираете строки из таблицы и вычисление условия x = NULL в предложении WHERE дало результат НЕИЗВЕСТНО, то вы не получите ни одной строки. Однако, есть и отличие: если выражение НЕ(ЛОЖЬ) вернёт истину, то НЕ(НЕИЗВЕСТНО) вернёт НЕИЗВЕСТНО.
С отрицанием NOT:
not(null = null) - UNKNOWN
not(null != null) - UNKNOWN
not(null = 'a') - UNKNOWN
not(null != 'a') - UNKNOWN
not(null <> 'a') - UNKNOWN
С оператором OR:
null or true - TRUE
null or false - UNKNOWN
null or null - UNKNOWN
С оператором AND:
null and true - UNKNOWN
null and false - FALSE
null and null - UNKNOWN
Запомнить легко, всего лишь в 2-х случаях неизвестность (UNKNOWN) переходит в определенность. Кстати из-за особенностей трёхзначной логики NOT IN вообще не дружит с NULL-ами: как только NULL попал в условия отбора, данных на выходе не будет.
NULL и пустая строка эквивалентны:
'' is null = TRUE
Также:
NULL+NULL=NULL
NULL+100=NULL
Такие дела.
CASE вернет NULL если не сработало ни одно условие.
ReplyDelete