Jak poznamenal Phil, s prázdným řetězcem se zachází jako s NULL a NULL se ničemu nerovná ani nerovná. Pokud očekáváte prázdné řetězce nebo hodnoty NULL, budete je muset zpracovat 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;
/
Pokud jde o nulová srovnání:
Podle dokumentace Oracle 12c o NULLS, null porovnání pomocí IS NULL
nebo IS NOT NULL
vyhodnotit jako TRUE
nebo FALSE
. Všechna ostatní srovnání se však vyhodnotí jako UNKNOWN
, ne FALSE
. V dokumentaci se dále uvádí:
Podmínka, která se vyhodnotí jako NEZNÁMÁ, působí téměř jako NEPRAVDA. Například příkaz SELECT s podmínkou v klauzuli WHERE, která se vyhodnotí jako UNKNOWN, nevrátí žádné řádky. Podmínka vyhodnocená jako NEZNÁMÁ se však liší od NEPRAVDA v tom, že další operace s vyhodnocením NEZNÁMÉ podmínky se vyhodnotí jako NEZNÁMÁ. Tedy NOT FALSE se vyhodnotí jako TRUE, ale NOT UNKNOWN se vyhodnotí jako UNKNOWN.
Referenční tabulku poskytuje 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
Také jsem se dozvěděl, že bychom neměli psát PL/SQL za předpokladu, že prázdné řetězce budou vždy vyhodnoceny jako NULL:
Oracle Database aktuálně považuje znakovou hodnotu s délkou nula za hodnotu null. To však nemusí platit v budoucích verzích a Oracle doporučuje, abyste s prázdnými řetězci nezacházeli stejně jako s hodnotami null.