Oracle
 sql >> Base de données >  >> RDS >> Oracle

Problème de comparaison de chaînes Oracle PL/SQL

Comme l'a noté Phil, la chaîne vide est traitée comme un NULL, et NULL n'est égal ou différent de rien. Si vous attendez des chaînes vides ou des valeurs NULL, vous devrez les gérer avec 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;
 /

Concernant les comparaisons nulles :

Selon la documentation Oracle 12c sur NULLS, les comparaisons nulles utilisant IS NULL ou IS NOT NULL évaluer à TRUE ou FALSE . Cependant, toutes les autres comparaisons sont évaluées à UNKNOWN , pas FALSE . La documentation indique en outre :

Une condition évaluée à INCONNU agit presque comme FAUX. Par exemple, une instruction SELECT avec une condition dans la clause WHERE qui prend la valeur UNKNOWN ne renvoie aucune ligne. Cependant, une condition évaluée à UNKNOWN diffère de FALSE en ce que d'autres opérations sur une évaluation de condition UNKNOWN seront évaluées à UNKNOWN. Ainsi, NOT FALSE est évalué à TRUE, mais NOT UNKNOWN est évalué à UNKNOWN.

Une table de référence est fournie par 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

J'ai aussi appris que nous ne devrions pas écrire PL/SQL en supposant que les chaînes vides seront toujours évaluées comme NULL :

Oracle Database traite actuellement une valeur de caractère avec une longueur de zéro comme nulle. Cependant, cela peut ne plus être vrai dans les versions futures et Oracle recommande de ne pas traiter les chaînes vides de la même manière que les valeurs nulles.