Zoals Phil opmerkte, wordt de lege tekenreeks behandeld als een NULL en is NULL nergens gelijk aan of ongelijk aan. Als je lege strings of NULL's verwacht, moet je die afhandelen met 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;
/
Over nulvergelijkingen:
Volgens de Oracle 12c-documentatie over NULLS, nulvergelijkingen met behulp van IS NULL
of IS NOT NULL
evalueer tot TRUE
of FALSE
. Alle andere vergelijkingen zijn echter UNKNOWN
, niet FALSE
. De documentatie vermeldt verder:
Een voorwaarde die evalueert tot ONBEKEND, gedraagt zich bijna als ONWAAR. Een SELECT-instructie met een voorwaarde in de WHERE-component die resulteert in UNKNOWN, retourneert bijvoorbeeld geen rijen. Een voorwaarde die wordt geëvalueerd tot ONBEKEND verschilt van FALSE in die zin dat verdere bewerkingen op een ONBEKENDE voorwaarde evaluatie tot ONBEKEND zullen worden beoordeeld. Dus NOT FALSE resulteert in TRUE, maar NOT UNKNOWN resulteert in UNKNOWN.
Oracle levert een referentietabel:
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
Ik heb ook geleerd dat we geen PL/SQL moeten schrijven in de veronderstelling dat lege strings altijd als NULL zullen worden geëvalueerd:
Oracle Database behandelt momenteel een tekenwaarde met een lengte van nul als null. In toekomstige releases kan dit echter niet zo blijven en Oracle raadt aan om lege strings niet op dezelfde manier te behandelen als nulls.