Както отбеляза Фил, празният низ се третира като NULL и NULL не е равен или неравен на нищо. Ако очаквате празни низове или NULL, ще трябва да се справите с тези с 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;
/
Относно нулевите сравнения:
Според документацията на Oracle 12c за NULLS, нулеви сравнения с помощта на IS NULL
или IS NOT NULL
направи оценка на TRUE
или FALSE
. Въпреки това, всички други сравнения се оценяват на UNKNOWN
, не FALSE
. В документацията се посочва още:
Условие, което се оценява на НЕИЗВЕСТНО, действа почти като FALSE. Например, оператор SELECT с условие в клаузата WHERE, което се оценява на UNKNOWN, не връща редове. Въпреки това, условие, оценявано на НЕИЗВЕСТНО, се различава от FALSE по това, че по-нататъшните операции върху оценката на НЕИЗВЕСТНО състояние ще се оценяват на НЕИЗВЕСТНО. По този начин, NOT FALSE се оценява на TRUE, но NOT UNKNOWN оценява на НЕИЗВЕСТНО.
Референтна таблица е предоставена от 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
Освен това научих, че не трябва да пишем PL/SQL, като приемем, че празните низове винаги ще се оценяват като NULL:
Oracle Database в момента третира символна стойност с дължина нула като нула. Това обаче може да не продължи да е вярно в бъдещи издания и Oracle препоръчва да не третирате празните низове по същия начин като нулеви.