Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Problem beim Vergleich von Oracle PL/SQL-Strings

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.