8

NULL文字列 NULL ではなく、NULL が値であるこのテーブルがあります。

MYCOL
--------
NULL
example

このクエリが行を返さないのはなぜですか?NULL

select * from example_so where nvl(mycol, '') = '';
4

3 に答える 3

16

''NULLOracle は他の高水準言語や DBMS のように空の文字列をサポートしていないため、再びOracle にあります。

IS NULLまたはを使用して NULL/空の文字列を探す必要がありますIS NOT NULL

NULL構文的には有効ですが、他の関係演算子は に対して機能しません。SQLFiddle デモ

そうでなければならない、

select * from example_so where mycol IS NULL

編集:ドキュメントに従って

Oracle Database は現在、長さが 0 の文字値を NULL として扱います。ただし、これは今後のリリースでは当てはまらない可能性があるため、空の文字列を null と同じように扱わないことをお勧めします。

于 2014-10-09T09:24:52.677 に答える
7

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>
于 2014-10-09T09:25:13.627 に答える
0

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'));
于 2014-10-09T10:22:43.310 に答える