Documentación Firebird → Base de Datos Firebird → Guía de NULL en Firebird → NULL en sentencias if |
Si la condición de una sentencia if devuelve un NULL, la cláusula then se salta y (si existe) se ejecuta la cláusula else. Pero ¡cuidado! La condición debe comportarse como false en este caso, pero no tiene el valor false. Es todavía NULL, y pueden suceder cosas extrañas si lo olvidas. Los siguientes ejemplos exploran algunas de las obras diabólicas de NULL en las sentencias if.
if (a = b) then MiVariable = 'Igual'; else MiVariable = 'No igual';
Si a y b son ambas NULL, MiVariable será “No igual” al ejecutar este código. La razón es que la expresión “a = b” devuelve NULL si - al menos - uno de ellos es NULL. Con esta condición NULL, el bloque then es ignorado y el else es ejecutado.
if (a <> b) then MiVariable = 'No igual'; else MiVariable = 'Igual';
Aquí, MiVariable será “Igual” si a es NULL y b no o viceversa. La explicación es análoga al ejemplo anterior.
if (not (a <> b)) then MiVariable = 'Igual'; else MiVariable = 'No igual';
Esta otra parece que devuelve el mismo resultado que la anterior, ¿Es así? Después de todo, hemos invertido la condición e intercambiado las cláusulas then y else. Y, de hecho, siempre que ninguna variable es NULL, ambos códigos son equivalentes. Pero siempre que a o b son NULL, lo es la expresión entera y se ejecuta la cláusula else y el resultado es “No igual”.
Por supuesto, somos conscientes de que este tercer ejemplo es totalmente equivalente al primero. Simplemente lo hemos incluido para hacer hincapié en que not(NULL) es NULL. Por tanto, en condiciones que resulten en NULL, not() no las invierte.
Documentación Firebird → Base de Datos Firebird → Guía de NULL en Firebird → NULL en sentencias if |