Документация Firebird → Документация по Firebird → 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 → Документация по Firebird → NULL в СУБД Firebird → NULL в операторе if |