Ensemble Firebird Doc → Firebird Docs → 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(NULL) est NULL. Donc, dans les situations où l'expression testée est NULL, not() n'inverse pas le résultat .
Ensemble Firebird Doc → Firebird Docs → Guide Firebird et NULL → NULL dans des instructions if |