Come ha notato Phil, la stringa vuota viene trattata come NULL e NULL non è uguale o disuguale a nulla. Se ti aspetti stringhe vuote o NULL, dovrai gestirle con 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;
/
Riguardo ai confronti nulli:
Secondo la documentazione di Oracle 12c su NULLS, i confronti nulli utilizzano IS NULL
o IS NOT NULL
valuta TRUE
o FALSE
. Tuttavia, tutti gli altri confronti restituiscono UNKNOWN
, non FALSE
. La documentazione afferma inoltre:
Una condizione che restituisce SCONOSCIUTO si comporta quasi come FALSA. Ad esempio, un'istruzione SELECT con una condizione nella clausola WHERE che restituisce UNKNOWN non restituisce alcuna riga. Tuttavia, una condizione valutata come SCONOSCIUTO differisce da FALSA in quanto ulteriori operazioni su una valutazione della condizione SCONOSCIUTO restituiranno SCONOSCIUTO. Pertanto, NOT FALSE restituisce TRUE, ma NOT UNKNOWN restituisce UNKNOWN.
Una tabella di riferimento è fornita da 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
Ho anche imparato che non dovremmo scrivere PL/SQL presupponendo che le stringhe vuote valutino sempre come NULL:
Oracle Database attualmente tratta un valore di carattere con una lunghezza pari a zero come null. Tuttavia, questo potrebbe non essere vero nelle versioni future e Oracle consiglia di non trattare le stringhe vuote come valori null.