Главная

Sunday, 11 March 2018

Значение NULL или просто Нет Данных.

Привет.

В 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

Такие дела.

1 comment:

  1. CASE вернет NULL если не сработало ни одно условие.

    ReplyDelete

А что вы думаете по этому поводу?