Oracle
 sql >> Database >  >> RDS >> Oracle

Problema di confronto tra stringhe Oracle PL/SQL

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.