web-dev-qa-db-ja.com

Oracleの空の文字列はnullに変換されます

挿入を行うと、空の文字列がnullに変換されます。

insert into test (f) values ('');

これで、nを含むfの行があります。

しかし、テーブルにクエリを実行すると、 ''を使用できません。

select * from test where f='';
no rows selected

Nullを使用できます。

select * from test where f is null;
____F_
NULL

つまり...空の文字列は挿入に使用できないとOracleが判断したようですが、クエリを実行すると空の文字列のままになります。空の文字列がnullになるときと空の文字列のままになるときのドキュメントはどこにありますか?

7
kainaw

これはすべてを言います:

select NVL('','it is null') as value
from dual;

SQLフィドル

2つのこと:

1)''は挿入時にNULLに変換されます。それはOracleのVARCHAR2です。

2)select * from test where f='';select * from test where f=NULLを実行しようとしていますが、これは定義されていません。NULLは等値演算子が好きでないため、何も返しません。 IS NULLまたはIS NOT NULLを使用する必要があります。

CHARデータ型はパディングされているため、動作が異なることを追加します。

8
Philᵀᴹ

Oracleは ''とNULLを同じように扱います。 ''を挿入する場合、 ''からNULLへの変換は行われません。WordのNULLがNULLまたはrtrim( 'a'、 'a')がNULLとして解釈されるのと同じ方法で、単に ''をNULLとして解釈します。 。

以下は、次の表と挿入を使用したデモです。

drop table t1;
create table t1 (c1 varchar2(10));
insert into t1 (c1) values ('');

上記の挿入により、c1にNULL値が挿入されました。次のようにその行を選択できます。

SELECT c1 FROM t1;

WHERE句を追加して同等性を比較し、比較される値の1つがNULLの場合、結果は常に不明になります。 Unknownはfalseと評価されますが、未知の値に対するさらなる操作は未知の値を生成します。 WHERE句にはデータに関係なく真になることのない条件が含まれているため、以下のすべては行を返しません。

SELECT c1 FROM t1 WHERE c1 = '';
SELECT c1 FROM t1 WHERE c1 = NULL;
SELECT c1 FROM t1 WHERE '' = '';
SELECT c1 FROM t1 WHERE NULL = NULL;

Oracleは、NULL値を持つ特定の列を持つ行を取得するための特別な構文を提供します-IS NULL

SELECT c1 FROM t1 WHERE c1 IS NULL;

OracleがNULLを比較して、DECODEステートメントや複合キーなどの他のNULL値と等しいものとして処理するいくつかの条件があります。

詳細については、 SQL言語リファレンス を参照してください。

6
Leigh Riffel