NULLが文字列NULLではなくNULL
値である次のテーブルがあります。
MYCOL
--------
NULL
example
このクエリがnotNULL
行を返すのはなぜですか?
select * from example_so where nvl(mycol, '') = '';
Oracleは他の高級言語やDBMSと同じように空の文字列をサポートしていないため、Oracleでは''
は再びNULL
になります。
IS NULL
またはIS NOT NULL
を使用してNULL /空の文字列を探す必要があります
構文的には有効ですが、他の関係演算子はNULL
に対して機能しません。 SQLFiddleデモ
しなければならない、
select * from example_so where mycol IS NULL
編集:ドキュメント
Oracle Databaseは現在、長さがゼロの文字値をnullとして扱います。ただし、これは将来のリリースでは引き続き当てはまらない可能性があるため、空の文字列をnullと同じように扱わないことをお勧めします。
_NULL = NULL
_は単に不明だからです。おそらく第三の状態? TRUE
でもFALSE
でもありません。
OracleはEMPTY STRINGをNULLと見なします。
nvl(mycol, '')
は、NULLをNULLに戻し、それをNULLと再度比較しているため、実際には意味がありません。
_SQL> WITH DATA AS(
2 SELECT 1 val, 'NULL' str FROM dual UNION ALL
3 SELECT 2, NULL str FROM dual UNION ALL
4 SELECT 3, '' str FROM dual UNION ALL
5 SELECT 4, 'some value' str FROM dual)
6 SELECT val, NVL(str, 'THIS IS NULL') FROM data WHERE str IS NULL
7 /
VAL NVL(STR,'THI
---------- ------------
2 THIS IS NULL
3 THIS IS NULL
SQL>
_
select * from example_so where nvl(mycol、 '')= '';
nvl(mycol、 '')はNULLとして生成されますそしてNULLを空の文字列と比較すると、比較できません
create table t(id varchar2(2));
insert into t values (nvl(null,'')); <------ this will insert NULL
insert into t values (nvl(null,'et'));