Oracle NULL

На работе делали этакую штучку с кешами. И там была такая вещь, что данные берутся из кеша, а потом на них накладывается фильтр, и этот фильтр должен отработать так, как он бы отработал на 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, а не полагаться на вышеприведённые правила.

Oracle NULL: 2 комментария

    1. Да, там ошибка была. NOT FALSE вернёт, разумеется, TRUE. Поправил, спасибо.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *