sql >> Base de Datos >  >> RDS >> Oracle

Problema de comparación de cadenas Oracle PL/SQL

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.