Wie Phil angemerkt hat, wird der leere String als NULL behandelt, und NULL ist mit nichts gleich oder ungleich. Wenn Sie leere Zeichenfolgen oder NULL-Werte erwarten, müssen Sie diese mit NVL()
behandeln :
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;
/
Bezüglich Nullvergleichen:
Gemäß der Oracle 12c-Dokumentation zu NULLS sind Nullvergleiche mit IS NULL
oder IS NOT NULL
zu TRUE
auswerten oder FALSE
. Alle anderen Vergleiche werden jedoch zu UNKNOWN
ausgewertet , nicht FALSE
. In der Dokumentation heißt es weiter:
Eine Bedingung, die zu UNKNOWN ausgewertet wird, verhält sich fast wie FALSE. Beispielsweise gibt eine SELECT-Anweisung mit einer Bedingung in der WHERE-Klausel, die zu UNKNOWN ausgewertet wird, keine Zeilen zurück. Eine zu UNBEKANNT ausgewertete Bedingung unterscheidet sich jedoch von FALSCH darin, dass weitere Operationen an einer UNBEKANNTEN Bedingungsauswertung zu UNBEKANNT ausgewertet werden. Somit wird NOT FALSE zu TRUE ausgewertet, aber NOT UNKNOWN zu UNKNOWN.
Eine Referenztabelle wird von Oracle bereitgestellt:
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
Ich habe auch gelernt, dass wir PL/SQL nicht schreiben sollten, wenn wir davon ausgehen, dass leere Strings immer als NULL ausgewertet werden:
Oracle Database behandelt derzeit einen Zeichenwert mit einer Länge von Null als Null. Dies gilt jedoch möglicherweise nicht mehr für zukünftige Versionen, und Oracle empfiehlt, leere Zeichenfolgen nicht genauso wie Nullen zu behandeln.