Firebird Documentation Index → NULL в СУБД Firebird → NULL в операторе if |
Если выражение оператора if
вычисляется как
NULL
, то предложение then
пропускается и выполняется предложение else
(если оно
есть). Но берегитесь! В этом случае значение выражения может
вести себя, подобно false
, но
это не значит, что значение равно
false
. Это все еще NULL
, могут
произойти непонятные вещи, если вы забудете об этом. Следующие примеры
рассматривают несколько ужасающее поведение NULL
в
операторе if
:
if (a = b) then MyVariable = 'Equal'; else MyVariable = 'Not equal';
Если a
и b
оба
NULL
, MyVariable
станет равно
«Not equal
» после выполнения этого
кода. Причина состоит в том, что выражение «a =
b
» дает в итоге NULL
, если хотя
бы один из аргументов NULL
. Если значение
тестового выражения NULL
, то блок
then
пропускается, а исполняется блок
else
.
if (a <> b) then MyVariable = 'Not equal'; else MyVariable = 'Equal';
Здесь, MyVariable
станет
«Equal
», если a
является NULL
, а b
- нет, или
наоборот. Объяснение аналогчично приведенному в предыдущем
примере.
if (not (a <> b)) then MyVariable = 'Equal'; else MyVariable = 'Not equal';
Это выглядит так, как будто здесь будет получен тот же самый
результат, как и в предыдущем примере. Не так ли? После всего мы
инвертируем тестовое выражение и меняем местами предложения
then
и else
. И на самом деле,
если ни одна из переменных не является NULL
, оба
фрагмента кода эквивалентны. Но как только a
или
b
становятся NULL
, то же
получаем и для всего тестового выражения, и выполняется предложение
else
, а в результате получаем «Not
equal
».
Конечно мы в курсе, что третий пример полностью эквивалентен
первому. Мы просто привели его, чтобы еще раз подчеркнуть, что
not(
является
NULL
)NULL
. Таким образом, в случае, когда тестовое
выражение вычисляется, как NULL
,
not()
не инвертирует его.
Firebird Documentation Index → NULL в СУБД Firebird → NULL в операторе if |