Поговорим подробнее о действиях над выражениями, содержащими Null-значения.
Общее правило работы с Null-значениями (то, что
результат операций над Null-значениями есть Null-значение) применяется к
следующим операциям:
1) к арифметическим;
2) к побитным операциям отрицания, конъюнкции и дизъюнкции (кроме законов поглощения);
3) к операциям со строками (например, конкотинации – сцепления строк);
4) к операциям сравнения (<, ≤, ≠, ≥, >).
Приведем примеры. В результате применений следующих операций будут получены Null-значения:
3 + Null, 1/ Null, (Иванов' + '' + Null) ≔ Null
Здесь вместо обычного равенства использована операция подстановки
«≔» из-за особого характера работы с Null-значениями. Далее в подобных
ситуациях также будет использоваться этот символ, который означает, что
выражение справа от символа подстановки может заменить собой любое
выражение из списка слева от символа подстановки.
Характер Null-значений приводит к тому, что часто в
некоторых выражениях вместо ожидаемого нуля получается Null-значение,
например:
(x – x), y * (x – x), x * 0 ≔ Null при x = Null.
Все дело в том, что при подстановке,
например, в выражение (x – x) значения x = Null, мы получаем выражение
(Null – Null), и в силу вступает общее правило вычисления значения
выражения, содержащего Null-значения, и информация о том, что здесь
Null-значение соответствует одной и той же переменной теряется.
Можно сделать вывод, что при вычислении любых операций, кроме логических, Null-значения интерпретируются как неприменимые, и поэтому в результате получается тоже Null-значение.
К не менее неожиданным результатам приводит
использование Null-значений в операциях сравнения. Например, в следующих
выражениях также получаются Null-значения вместо ожидаемых логических
значений True или False:
(Null < Null); (Null ≤ Null); (Null = Null); (Null ≠ Null);
(Null > Null); (Null ≥ Null) ≔ Null;
Таким образом, делаем вывод, что нельзя
говорить о том, что Null-значение равно или не равно самому себе. Каждое
новое вхождение Null-значения рассматривается как независимое, и каждый
раз Null-значения воспринимаются как различные неизвестные значения.
Этим Null-значения кардинально отличаются от всех остальных типов
данных, ведь мы знаем, что обо всех пройденных ранее величинах и их
типах с уверенностью можно было говорить, что они равны или не равны
друг другу.
Итак, мы видим, что Null-значения не являются значениями
переменных в обычном смысле этого слова. Поэтому становится невозможным
сравнивать значения переменных или выражения, содержащие Null-значения,
поскольку в результате мы будем получать не логические значения True
или False, а Null-значения, как в следующих примерах:
(x < Null); (x ≤ Null); (x = Null); (x ≠ Null); (x > Null);
(x ≥ Null) ≔ Null;
Поэтому по аналогии с пустыми значениями для проверки выражения на Null-значения необходимо использовать специальный предикат:
IsNull (<выражение>), что буквально означает «есть Null».
Логическая функция возвращает значение True, если в
выражении присутствует Null или оно равно Null, и False – в противном
случае, но никогда не возвращает значение Null. Предикат IsNull может
применяться к переменным и выражению любого типа. Если применять его к
выражениям пустого типа, предикат всегда будет возвращать False.
Например: Итак,
действительно, видим, что в первом случае, когда предикат IsNull взяли
от нуля, на выходе получилось значение False. Во всех случаях, в том
числе во втором и третьем, когда аргументы логической функции оказались
равными Null-значению, и в четвертом случае, когда сам аргумент и был
изначально равен Null-значению, предикат выдал значение True.
|