Firebird Documentation Index → Guide Firebird et NULL → NULL dans des instructions if |
Si l'expression à tester dans l'instruction if
est évaluée à NULL
, la clause then
est ignorée et la clause else
(si elle est présente)
exécutée. Attention! Cette expression semble se
comporter comme false
dans ce
cas, mais elle n'a pas la valeur
false
. Elle est toujours NULL
,
et des choses curieuses peuvent arriver si vous oubliez cela. Les exemples
suivants explorent quelques diaboliques comportements de
NULL
dans des instructions if
:
if (a = b) then MyVariable = 'Egal'; else MyVariable = 'Different';
Si a
et b
sont tous deux
NULL
, MyVariable
sera
« Different
» après l'exécution de ce
code. Cela vient de ce que l'expression « a =
b
» renvoie NULL
si au moins un
des termes est NULL
. Avec l'expression évaluée à
NULL
, le bloc then
est ignoré,
et le bloc else
exécuté.
if (a <> b) then MyVariable = 'Different'; else MyVariable = 'Egal';
Ici, MyVariable
sera
« Egal
» si a
est
NULL
et b
ne l'est pas, et
vice versa. L'explication est analogue à celle de l'exemple
précédent.
if (not (a <> b)) then MyVariable = 'Egal'; else MyVariable = 'Different';
Il semble que cet exemple devrait donner le même résultat que
l'exemple précédent, n'est ce pas? Après tout, nous avons inversé
l'expression de test et interverti les clauses then
et else
. Et de fait, tant qu'aucune variable est
NULL
, les deux codes sont équivalents. Mais dès
que a
ou b
est
NULL
, alors toute l'expression l'est aussi, la
clause else
est exécutée, et le résultat est
« Different
».
Bien sûr, nous savons que ce troisième exemple est équivalent
au premier. Nous ne vous l'avons proposé que pour insister sur le
fait que not(
est
NULL
)NULL
. Donc, dans les situations où l'expression
testée est NULL
, not()
n'inverse pas le résultat .
Firebird Documentation Index → Guide Firebird et NULL → NULL dans des instructions if |