web-dev-qa-db-ja.com

空の文字列を持つOracleNVL

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

MYCOL
--------
NULL
example

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

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

Oracleは他の高級言語やDBMSと同じように空の文字列をサポートしていないため、Oracleでは''は再びNULLになります。

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

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

しなければならない、

select * from example_so where mycol IS NULL

編集:ドキュメント

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

14

_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>
_
7
Lalit Kumar B

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'));
0
user3380585