Som Phil noterade behandlas den tomma strängen som en NULL, och NULL är inte lika med eller ojämlikt med någonting. Om du förväntar dig tomma strängar eller NULLs måste du hantera de med 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;
/
Angående nolljämförelser:
Enligt Oracle 12c-dokumentationen om NULLS, nolljämförelser med IS NULL
eller IS NOT NULL
utvärdera till TRUE
eller FALSE
. Men alla andra jämförelser utvärderas till UNKNOWN
, inte FALSE
. I dokumentationen står det vidare:
Ett tillstånd som utvärderas till OKÄNT fungerar nästan som FALSK. Till exempel returnerar en SELECT-sats med ett villkor i WHERE-satsen som utvärderas till UNKNOWN inga rader. Ett tillstånd som utvärderas till OKÄNT skiljer sig dock från FALSK genom att ytterligare operationer på en OKÄNT tillståndsutvärdering kommer att utvärderas till OKÄNT. Alltså, NOT FALSE utvärderas till TRUE, men NOT ONKNOWN utvärderas till OKÄNT.
En referenstabell tillhandahålls av 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
Jag lärde mig också att vi inte ska skriva PL/SQL förutsatt att tomma strängar alltid kommer att utvärderas som NULL:
Oracle Database behandlar för närvarande ett teckenvärde med längden noll som noll. Detta kanske dock inte fortsätter att vara sant i framtida utgåvor, och Oracle rekommenderar att du inte behandlar tomma strängar på samma sätt som nollor.