Som Phil bemærkede, behandles den tomme streng som en NULL, og NULL er ikke lig med eller ulig med noget. Hvis du forventer tomme strenge eller NULL'er, skal du håndtere dem med NVL()
:
DECLARE str1 varchar2(4000); str2 varchar2(4000); BEGIN str1:=''; str2:='sdd';-- Angiv en alternativ nulværdi, der ikke findes i dine data:IF(NVL(str1,'X') !=NVL(str2,'Y')) THEN dbms_output.put_line('The to strenge er ikke ens'); AFSLUT HVIS; ENDE; /
Angående nul-sammenligninger:
Ifølge Oracle 12c-dokumentationen om NULLS, nul-sammenligninger ved hjælp af IS NULL
eller ER IKKE NULL
evaluer til TRUE
eller FALSK
. Alle andre sammenligninger evalueres dog til UNKNOWN
, ikke FALSK
. I dokumentationen står der endvidere:
En tilstand, der vurderes til UKENDT, virker næsten som FALSK. For eksempel returnerer en SELECT-sætning med en betingelse i WHERE-udtrykket, der evalueres til UNKNOWN, ingen rækker. En tilstand, der evalueres til UNKENDT, adskiller sig dog fra FALSK ved, at yderligere operationer på en UNKENDT tilstandsevaluering vil evalueres til UNKENDT. Således vurderes NOT FALSE til TRUE, men NOT UNKNOWN evalueres til UNKNOWN.
En referencetabel leveres af Oracle:
Betingelsesværdi af en evaluering---------------------------------------------- -a ER NULL 10 FALSEa ER IKKE NULL 10 TRUE a ER NULL NULL TRUEa ER IKKE NULL NULL FALSEa =NULL 10 UNKNOWNa !=NULL 10 UNKNOWNa =NULL NULL UKENDT Na !=NULL NULL UKENDT =NULL UKENDT10Na Ukendt!
Jeg lærte også, at vi ikke skal skrive PL/SQL, forudsat at tomme strenge altid vil evalueres som NULL:
Oracle Database behandler i øjeblikket en tegnværdi med en længde på nul som null. Dette vil dog muligvis ikke fortsætte med at være sandt i fremtidige udgivelser, og Oracle anbefaler, at du ikke behandler tomme strenge på samme måde som nuller.