Documenti Firebird → Guida sull'uso di NULL nel linguaggio SQL di Firebird → NULL negli statement if |
Se l'espressione di test di uno statement if risolve a NULL, la clausola then viene saltata e la parte else (se presente) viene eseguita. Però attenzione! L'espressione si comporta come false in questo caso, ma non ha il valore false. Il valore è ancora NULL, e possono succedere cose strane se ci si dimentica di qquesto fatto. Gli esempi seguenti mostrano alcuni fra gli diabolici effetti del NULL negli statement di if:
if (a = b) then MyVariable = 'uguali'; else MyVariable = 'diversi';
Se a ed anche b sono entrambi NULL, la MyVariable sarà “diversi” dopo aver eseguito il codice. La ragione è che l'espressione “a = b”, come abbiamo visto precedentemente, vale NULL se almeno uno dei termini è NULL. Con l'espressione di test che vale NULL, il blocco then non viene eseguito, ed invece viene eseguito il blocco else.
if (a <> b) then MyVariable = 'diversi'; else MyVariable = 'uguali';
In questo caso, MyVariable diventerà “uguali” se a vale NULL ed invece b no, oppure viceversa. La spiegazione è analoga a quella dell'esempio precedente.
if (not (a <> b)) then MyVariable = 'uguali'; else MyVariable = 'diversi';
Sembrerebbe che questo esempio debba dare lo stesso risultato del precedente, no? Dopo tutto, si è invertiti le espressioni di test e scambiate le clausole di then con quella di else. E veramente, finchè nessuna delle due variabili è NULL, entrambi i due frammenti di codice sono equivalenti. Ma non appena uno dei due diventa NULL, altrettanto fa l'espressione di test e la clausola di else viene eseguita, pertanto il risultato diventerà “diversi”.
Naturamente siamo consci che questo terzo esempio è completamente equivalente al primo. Noi l'abbiamo semplicemente inclusa qui per sottolineare una volta ancora che not(NULL) è ancora NULL. Così, nelle situazioni in cui le espressioni di test valgono NULL, il not() non lo inverte.
Documenti Firebird → Guida sull'uso di NULL nel linguaggio SQL di Firebird → NULL negli statement if |