挿入を行うと、空の文字列が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になるときと空の文字列のままになるときのドキュメントはどこにありますか?
これはすべてを言います:
select NVL('','it is null') as value
from dual;
2つのこと:
1)''
は挿入時にNULL
に変換されます。それはOracleのVARCHAR2
です。
2)select * from test where f='';
はselect * from test where f=NULL
を実行しようとしていますが、これは定義されていません。NULL
は等値演算子が好きでないため、何も返しません。 IS NULL
またはIS NOT NULL
を使用する必要があります。
CHAR
データ型はパディングされているため、動作が異なることを追加します。
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言語リファレンス を参照してください。