На работе делали этакую штучку с кешами. И там была такая вещь, что данные берутся из кеша, а потом на них накладывается фильтр, и этот фильтр должен отработать так, как он бы отработал на Oracle Database.
Я тут вспомнил, что в базах данных обычно любая операция возвращает NULL, если хотя бы один из операндов равен NULL. Я не был до конца уверен на счёт Oracle, но те СУБД, с которыми я работал до этого, поступали именно так. Например PostgreSQL с NULL работает именно так. Но у Oracle Database уже многолетняя история, так что он вполне мог бы работать иначе.
В итоге выяснилось, что в Oracle всё же работает также:
- Любая арифметическая операция, содержащая NULL в качестве одного из операндов возвращает NULL.
- Конкатенация строки и NULL возвращает строку. Имейте в виду, что Oracle Database рассматривает пустую строку как NULL, о чём я уже писал.
- Операции сравнения возвращают UNKNOWN, если один из операндов равен NULL.
- Любая логическая операция с NULL возвращает UNKNOWN. Тут прошу обратить внимание, что как я уже писал ранее, в Oracle нет типа BOOLEAN, но он есть в PL/SQL.
Хотя текущие реализации Oracle Database при конкатенации строки и NULL возвращают строку, но на это НЕ рекомендуется полагаться. Используйте NVL, чтобы исключить подобные операции.
В условных выражениях вычисленное значение UNKNOWN ведёт себя почти так же, как и FALSE, но они отличаются. Например, NOT FALSE вернёт TRUE, а NOT UNKNOWN вернёт UNKNOWN.
Всегда используйте операции IS NULL и/или IS NOT NULL для проверки значений на NULL. Это единственно верный способ проверить на NULL.
UNKNOWN с логическими операциями ведёт себя так (в SQL у Oracle вы не можете напрямую указать ни TRUE, ни FALSE, ни UNKNOWN, здесь выражения приведены для понимания):
- Логическая операция NOT возвращает UNKNOWN, если ей передать значение UNKNOWN.
- Логическая операция AND возвращает TRUE, если оба операнда TRUE. Возвращает FALSE, если один из операндов FALSE. В противном случае возвращает UNKNOWN. Это означает, что FALSE AND UNKNOWN возвращает UNKNOWN и UNKNOWN AND FALSE возвращает UNKNOWN.
- Логическая операция OR возвращает TRUE, если один из операндов равен TRUE. Возвращает FALSE, если оба операнда равны FALSE. В остальных случаях возвращает UNKNOWN. Например, UNKNOWN OR FALSE вернёт UNKNOWN, UNKNOWN OR TRUE возвращает TRUE, FALSE OR UNKNOWN возвращает UNKNOWN.
Вывод про NULL в Oracle: Как видите, поведение со значениями NULL далеко не такое однозначное. Я бы порекомендовал любые значения, которые могут содержать NULL проверять на IS NULL, а не полагаться на вышеприведённые правила.
Например, NOT FALSE вернёт FALSE? Правда?
Да, там ошибка была. NOT FALSE вернёт, разумеется, TRUE. Поправил, спасибо.