En el primer ejemplo asignamos a la variable nombre el valor NULL. La condición nombre != 'JAVIER' se evalúa como NULL != 'JAVIER' y resulta FALSA! El valor NULL es distinto de la cadena de caracteres 'JAVIER', sin embargo la ejecución se bifurca por la rama del ELSE. Se muestra el mensaje 'CONDICION FALSA, SON IGUALES. EJECUTA ELSE.'. Dónde está el error?
SQL> RUN
1 DECLARE
2 nombre VARCHAR2(40) := NULL;
3 BEGIN
4 IF nombre != 'JAVIER' THEN
5 DBMS_OUTPUT.PUT_LINE('CONDICION VERDADERA, SON DISTINTOS. EJECUTA THEN.');
6 ELSE
7 DBMS_OUTPUT.PUT_LINE('CONDICION FALSA, SON IGUALES. EJECUTA ELSE.');
8 END IF;
9* END;
CONDICION FALSA, SON IGUALES. EJECUTA ELSE.
Procedimiento PL/SQL terminado con éxito.
En el segundo ejemplo asignamos a la variable nombre la cadena de caracteres 'NULL'. La condición nombre != 'JAVIER' se evalúa como una comparación entre dos cadenas de caracteres 'NULL' != 'JAVIER' y resulta VERDADERA! Se muestra el mensaje 'CONDICION VERDADERA, SON DISTINTOS. EJECUTA THEN.'.
SQL> RUN
1 DECLARE
2 nombre VARCHAR2(40) := 'NULL';
3 BEGIN
4 IF nombre != 'JAVIER' THEN
5 DBMS_OUTPUT.PUT_LINE('CONDICION VERDADERA, SON DISTINTOS. EJECUTA THEN.');
6 ELSE
7 DBMS_OUTPUT.PUT_LINE('CONDICION FALSA, SON IGUALES. EJECUTA ELSE.');
8 END IF;
9* END;
CONDICION VERDADERA, SON DISTINTOS. EJECUTA THEN.
Procedimiento PL/SQL terminado con éxito.
La clave es entender que la evaluación de condiciones que contienen al menos un elemento con valor NULL, SIEMPRE resultan FALSAS. La única excepción es la cláusula IS NULL.
NULL != 'JAVIER' es FALSO
NULL = 'JAVIER' es FALSO
NULL = NULL es FALSO
NULL IS NULL es VERDADERO
NULL IS NOT NULL es FALSO
En el tercer ejemplo tomamos precauciones para no repetir el comportamiento inesperado del primer ejemplo. Modificamos la línea 4 de evaluación de la condición agregando la función NVL que reemplazará los valores nulos de la variable nombre por la cadena de caracteres 'VALOR NULO'. Ahora si, la condición 'VALOR NULO' != 'JAVIER' es VERDADERA.
SQL> RUN
1 DECLARE
2 nombre VARCHAR2(40) := NULL;
3 BEGIN
4 IF NVL(nombre,'VALOR NULO') != 'JAVIER' THEN
5 DBMS_OUTPUT.PUT_LINE('CONDICION VERDADERA, SON DISTINTOS. EJECUTA THEN.');
6 ELSE
7 DBMS_OUTPUT.PUT_LINE('CONDICION FALSA, SON IGUALES. EJECUTA ELSE.');
8 END IF;
9* END;
CONDICION VERDADERA, SON DISTINTOS. EJECUTA THEN.
Procedimiento PL/SQL terminado con éxito.