Jak zauważył Phil, pusty łańcuch jest traktowany jako NULL, a NULL nie jest niczego równy ani nierówny. Jeśli oczekujesz pustych ciągów lub wartości NULL, będziesz musiał obsłużyć je za pomocą 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;
/
Dotyczy porównań zerowych:
Zgodnie z dokumentacją Oracle 12c dotyczącą NULLS, porównania wartości null przy użyciu IS NULL
lub IS NOT NULL
oceniaj na TRUE
lub FALSE
. Jednak wszystkie inne porównania są oceniane jako UNKNOWN
, nie FALSE
. Dokumentacja dalej stwierdza:
Warunek, którego wynikiem jest NIEZNANE, działa prawie jak FAŁSZ. Na przykład instrukcja SELECT z warunkiem w klauzuli WHERE, której wynikiem jest UNKNOWN, nie zwraca żadnych wierszy. Jednak warunek oceniający jako NIEZNANY różni się od FAŁSZ tym, że dalsze operacje na ocenie warunku NIEZNANEGO zostaną ocenione jako NIEZNANY. Zatem NOT FALSE zwraca TRUE, ale NOT UNKNOWN zwraca UNKNOWN.
Tabela referencyjna jest dostarczana przez 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
Dowiedziałem się również, że nie powinniśmy pisać PL/SQL, zakładając, że puste ciągi zawsze będą miały wartość NULL:
Oracle Database obecnie traktuje wartość znakową o długości zero jako null. Jednak może to nie być prawdą w przyszłych wydaniach, a Oracle zaleca, aby nie traktować pustych ciągów tak samo jak wartości null.