NULL это не значение, это его отсутствие, а отсутствие чего – не известно, по этому null=null или null!=null – нам НЕИЗВЕСТНО, да и вообще, сравнения чего-то с отсутствием чего-то дает в результате НЕИЗВЕСТНО, for ex. 5=null
Итак, у нас кроме ДА, НЕТ, появляется третье состояние НЕ ЗНАЮ – нечёткая троичная логика
В следующие условиях логика оракла такова, что в AND при одном false второй проверять нет смысла, а при true нужно и получаем null, при OR ситуация противоположная. Порядок значения не имеет.
1 2 3 4 |
null AND false = false null AND true = null null OR true = true null OR false = null |
Почему же не работает not in (1, null):
select * from dual where 1 not in (select 2 from dual union select null from dual)
1 not in (2, null) => (1!=2) AND (1!=null) => true AND null => null;
Для сравнения с null используются следующие операторы
IS NULL и IS NOT NULL
decode и null
decode(A,B,C,D) в случае с этой функцией оракл поступит иначе чем все описанное выше – если A и B будут пустыми функция вернет C
Функции для работы с отсутствующими значениями:
NULLIF(A,B) = if A=B then null else A
COALESCE(A,B,C..) возвращаете первое по порядку не пустое значение
NVL(A,B) возвращает не пустое A, если же А пустое то возвращает B
NVL2(A,B,C) если А не пустое возвращает B, если пустое то C
LNNVL(условие) используется во where, возвращает TRUE если условие FALSE или UNKNOWN и FALSE если условие TRUE
NANVL(A,B) возвращает B если A не числовое (NaN)
SYS_OP_MAP_NONNULL(A) используется для сравнения с пустыми значениями, по правилу null=null is true –
1 |
SELECT dummy FROM DUAL WHERE sys_op_map_nonnull (NULL) = sys_op_map_nonnull (NULL) |
NULL и пустая строка
length(”) вернет вам null, все потому что null и пустая строка эквивалентны в оракл (выглядят одинаково при записи в память)
Но в pl/sql ассоциативная коллекция позволяет хранить элементы с пустой строкой, а вот с null нет
Арифметика с null недопустима, вернее допустима но вернет ничего, по этому нужно nvl, а вот конкатенация в оракл работает.
Зато агрегаты игнорируют пустые значения