91

重複の可能性:
Oracle 9i が空の文字列を NULL として扱うのはなぜですか?

Oracle 10g には、TEMP_TABLE2 つの列だけで名前が付けられたテーブルがidありますdescription。これは、デモンストレーションのためだけです。

idはタイプのシーケンス生成主キーでNUMBER(35, 0) not nullあり、列DESCRIPTIONのタイプはVARCHAR2(4000) not nullです。

この場合の基本的なテーブル構造は次のようになります。

+--------------+-----------+---------------+
|Name          | Null?     | Type          |
+--------------+-----------+---------------+
|ID            | NOT NULL  | NUMBER(35)    |
|DESCRIPTION   | NOT NULL  | VARCHAR2(4000)|
+--------------+-----------+---------------+

INSERTこのテーブルを作成した後、代わりに次のコマンドを挿入しようとしています。

INSERT INTO temp_table (id, description) VALUES (1, null); ->unsuccessful
INSERT INTO temp_table (id, description) VALUES (2, '');   ->unsuccessful

not null列に制約が適用されているため、どちらも明らかに失敗していDESCRIPTIONます。

どちらの場合も、オラクルは文句を言います

ORA-01400: cannot insert NULL into ("WAGAFASHIONDB"."TEMP_TABLE"."DESCRIPTION")

NULL空の文字列は、Oracle では値として扱われます。


not null列の制約を削除した場合DESCRIPTION、基本的なテーブル構造は次のようになります

+--------------+-----------+---------------+
|Name          | Null?     | Type          |
+--------------+-----------+---------------+
|ID            | NOT NULL  | NUMBER(35)    |
|DESCRIPTION   |           | VARCHAR2(4000)|
+--------------+-----------+---------------+

指定された両方のINSERTコマンドが成功します。nullの列に値を含む行と空の文字列を含む行''を2 つ作成します。DESCRIPTIONTEMP_TABLE

ここで、次のSELECTコマンドを発行すると、

SELECT * FROM temp_table WHERE description IS NULL;

次に、一方の列に値があり、もう一方の列にnull空の文字列がある行の両方をフェッチします。''DESCRIPTION

ただし、次のSELECTステートメントは、TEMP_TABLE

SELECT * FROM temp_table WHERE description='';

列に空の文字列がある行も取得しませんDESCRIPTION


おそらく、ここでは Oracle がnull値と空の文字列を異なる方法で処理しているように見えますが、値と空の文字列の両方が制約付きの列に挿入されないようにするステートメントに''は当てはまらないようです。なぜそうなのですか?INSERTnull''not null

4

2 に答える 2

118

これは、Oracle が内部的に空の文字列を NULL 値に変更するためです。Oracle では、空の文字列を挿入できません。

一方、SQL Server では、達成しようとしていることを実行できます。

ここには 2 つの回避策があります。

  1. 「説明」フィールドが有効かどうかを示す別の列を使用します
  2. 空の文字列を格納する「説明」フィールドにダミーの値を使用します。(つまり、実際のデータがそのような説明値に遭遇しないと仮定して、フィールドを「stackoverflowrocks」に設定します)

もちろん、どちらもばかげた回避策です:)

于 2012-11-07T21:50:57.337 に答える
34

オラクルでは、空の varchar2 と null は同じように扱われ、あなたの観察はそれを示しています。

あなたが書くとき:

select * from table where a = '';

書くのと同じ

select * from table where a = null;

そしてそうではないa is null

これは決して true にならないため、行を返すことはありません。挿入でも同じですが、NOT NULL は、null または空の文字列 (null として扱われる) を挿入できないことを意味します。

于 2012-11-07T21:52:46.590 に答える