Как заметил Фил, пустая строка обрабатывается как 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
.Документация также гласит:
Условие, которое оценивается как НЕИЗВЕСТНОЕ, действует почти как ЛОЖЬ.Например, инструкция SELECT с условием в предложении WHERE, которое оценивается как UNKNOWN, не возвращает строк.Однако условие оценки UNKNOWN отличается от FALSE тем, что дальнейшие операции оценки состояния UNKNOWN будут оцениваться как UNKNOWN.Таким образом, NOT FALSE оценивается как TRUE, но NOT UNKNOWN оценивается как 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 в настоящее время обрабатывает символьное значение с нулевой длиной как ноль.Однако в будущих выпусках это может не соответствовать действительности, и Oracle рекомендует не рассматривать пустые строки так же, как пустые.