Philが指摘したように、空の文字列は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;
/
ヌル比較について:
NULLSに関するOracle12cのドキュメントによると、IS NULL
を使用したnull比較 またはIS NOT NULL
TRUE
に評価してください またはFALSE
。ただし、他のすべての比較はUNKNOWN
と評価されます 、ない FALSE
。ドキュメントにはさらに次のように記載されています:
UNKNOWNと評価される条件は、ほとんどFALSEのように機能します。たとえば、WHERE句にUNKNOWNと評価される条件を持つSELECTステートメントは、行を返しません。ただし、UNKNOWNに評価される条件は、UNKNOWN条件評価に対する以降の操作がUNKNOWNに評価されるという点で、FALSEとは異なります。したがって、NOT FALSEはTRUEと評価されますが、NOTUNKNOWNは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
また、空の文字列が常にNULLと評価されると仮定してPL/SQLを記述すべきではないことも学びました。
Oracle Databaseは現在、長さがゼロの文字値をnullとして扱います。ただし、これは将来のリリースでは引き続き当てはまらない可能性があるため、空の文字列をnullと同じように扱わないことをお勧めします。