1. ホーム
  2. oracle

[解決済み] Oracleのnullとemptyの文字列 [重複].

2023-03-31 16:06:49

質問

重複の可能性があります。

Oracle 9i はなぜ空の文字列を NULL として扱うのですか?

Oracle 10gのテーブルで TEMP_TABLE という名前のテーブルがあり、2 つのカラムだけがあります。 iddescription の2つの形式がありますが、これはあくまでデモンストレーションのためです。

列は 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 カラムに適用されます。

どちらの場合も、Oracle は次のような文句を言います。

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

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


もし私が not null の制約をなくすと DESCRIPTION カラムに制約をかけると、基本的なテーブル構造は次のようになります。

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

の両方と INSERT コマンドは成功します。これらは、2つの行を作成し、一方は null の値を持つ行と、空の文字列 '' の中に DESCRIPTION の列に TEMP_TABLE .

では、次のように発行すると SELECT コマンドを実行します。

SELECT * FROM temp_table WHERE description IS NULL;

を持つ行を両方取得します。 null の値を持ち、もう一方が空の文字列 '' の中に DESCRIPTION の列に追加します。

次のような SELECT ステートメントから行を取得しません。 TEMP_TABLE

SELECT * FROM temp_table WHERE description='';

に空文字列がある行も取得しません。 DESCRIPTION カラムに空文字列がある行も取得しません。


おそらく、Oracle は null 値と空文字列 '' とは異なりますが、しかし、ここでは INSERT ステートメントでは null の値と空文字列 '' を持つカラムに挿入されるのを防ぐことができます。 not null の制約があるカラムには挿入できません。なぜそうなるのでしょうか?

どのように解決するのか?

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

一方、SQL Serverでは、あなたが達成しようとしていることをさせることができます。

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

  1. description' フィールドが有効であるかどうかを示す別のカラムを使用する。
  2. 空の文字列を格納したい場合は、'description' フィールドに何らかのダミー値を使用します。(例えば、実際のデータがそのような説明の値に遭遇することはないと仮定して、フィールドを 'stackoverflowrocks' に設定します)

もちろん、両方とも愚かな回避策です :)