Como señaló Phil, la cadena vacía se trata como NULL, y NULL no es igual ni desigual a nada. Si espera cadenas vacías o NULL, deberá manejarlas con NVL()
:
DECLARE
str1 varchar2(4000);
str2 varchar2(4000);
BEGIN
str1:='';
str2:='sdd';
-- Provide an alternate null value that does not exist in your data:
IF(NVL(str1,'X') != NVL(str2,'Y')) THEN
dbms_output.put_line('The two strings are not equal');
END IF;
END;
/
Con respecto a las comparaciones nulas:
De acuerdo con la documentación de Oracle 12c sobre NULLS, comparaciones nulas usando IS NULL
o IS NOT NULL
evaluar a TRUE
o FALSE
. Sin embargo, todas las demás comparaciones dan como resultado UNKNOWN
, no FALSE
. La documentación establece además:
Una condición que se evalúa como DESCONOCIDA actúa casi como FALSA. Por ejemplo, una declaración SELECT con una condición en la cláusula WHERE que se evalúa como DESCONOCIDA no devuelve filas. Sin embargo, una condición que se evalúe como DESCONOCIDA difiere de FALSO en que las operaciones posteriores en una evaluación de condición DESCONOCIDA se evaluarán como DESCONOCIDA. Por lo tanto, NO FALSO se evalúa como VERDADERO, pero NO DESCONOCIDO se evalúa como DESCONOCIDO.
Oracle proporciona una tabla de referencia:
Condition Value of A Evaluation
----------------------------------------
a IS NULL 10 FALSE
a IS NOT NULL 10 TRUE
a IS NULL NULL TRUE
a IS NOT NULL NULL FALSE
a = NULL 10 UNKNOWN
a != NULL 10 UNKNOWN
a = NULL NULL UNKNOWN
a != NULL NULL UNKNOWN
a = 10 NULL UNKNOWN
a != 10 NULL UNKNOWN
También aprendí que no debemos escribir PL/SQL asumiendo que las cadenas vacías siempre se evaluarán como NULL:
Oracle Database actualmente trata un valor de carácter con una longitud de cero como nulo. Sin embargo, es posible que esto no siga siendo así en futuras versiones y Oracle recomienda que no trate las cadenas vacías como si fueran nulas.