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.