Como notó Phil, la cadena vacía se trata como NULL, y NULL no es igual o desigual a nada. Si espera que las cadenas vacías o NULL, que necesita para manejar aquellos 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;
/
En cuanto a las comparaciones nulos:
De acuerdo con la Oracle 12c documentation on NULLS, las comparaciones nulos utilizando IS NULL
o hacer IS NOT NULL
evaluar a TRUE
o FALSE
. Sin embargo, todas las demás comparaciones se evalúan a UNKNOWN
, y no aFALSE
. La documentación además establece:
Una condición que evalúa a actos DESCONOCIDOS casi como FALSO. Por ejemplo, una instrucción SELECT con una condición en la cláusula WHERE que evalúa a UNKNOWN no devuelve filas. Sin embargo, una condición que evalúa DESCONOCIDO difiere de FALSO en que las operaciones posteriores en una evaluación de condición DESCONOCIDA se evaluarán como DESCONOCIDAS. Por lo tanto, NO FALSO se evalúa como VERDADERO, pero NO DESCONOCIDO se evalúa como DESCONOCIDO.
una tabla de referencia es proporcionada por Oracle:
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 hay que escribir PL/SQL asumiendo cadenas vacías siempre evaluar como NULL: Base de datos
Oracle actualmente trata un valor de carácter con una longitud de cero como nulo. Sin embargo, esto puede no continuar siendo cierto en versiones futuras, y Oracle recomienda que no trate las cadenas vacías lo mismo que las nulas.
Tenga en cuenta que en Oracle una cadena vacía es equivalente a 'NULL' que puede no funcionar como se esperaba en una declaración de comparación de desigualdad – Phil
¿podría darme algunos consejos sobre cómo resolver este problema? –
Estas son dos preguntas distintas. Deberías preguntarles como tal, ya que así es como funciona SO. Una vez dicho esto, tu segunda pregunta es una castaña vieja que ya ha sido respondida varias veces. Por favor, busque antes de preguntar: http://stackoverflow.com/questions/tagged/oracle+string-aggregation – APC