NULL 値は、不定または該当なしの値を指定します。
NULL
NULL は、あらゆるデータ型の有効な値とは異なる特別な値です。ただし、NULL 値はすべてのデータ型で使用できます。NULL は、情報が不足または不適切であることを表すために使用します。次に示すとおり、NULL が使用される 2 つのケースは、独立していて、性質が異なります。
状況 | 説明 |
---|---|
不足 | フィールドに値はありますが、その値が不明です。 |
不適切 | フィールドは、この特定のローには適していません。 |
SQL では、NOT NULL 制限を使用してカラムを作成できます。このカラムには NULL 値を挿入できません。
NULL 値によって、SQL に 3 値的論理の概念が導入されました。NULL 値をどのような値 (NULL 値を含む) や比較演算子を使用して比較しても、結果は "UNKNOWN" です。この場合、TRUE を返す唯一の探索条件は IS NULL 述部です。SQL では、WHERE 句の探索条件が TRUE と評価された場合のみ、ローが選択されます。UNKNOWN または FALSE と評価されたローは、選択されません。
NULL 値に対するカラム領域の使用量は、カラム当たり 1 ビットであり、領域は 8 ビット単位で割り付けられます。NULL のビット使用量は、NULL 値を許容するテーブルのカラム数に基づいて決められます。
IS [ NOT ] truth-value 句は、NULL 値があるローを選択するために使用します (truth-value は TRUE、FALSE、または UNKNOWN のいずれかです)。この句の詳細については、探索条件を参照してください。
カラム Salary に NULL が格納されている場合の例を次に示します。
条件 | 真理値 | 選択 |
---|---|---|
Salary = NULL | UNKNOWN | NO |
Salary <> NULL | UNKNOWN | NO |
NOT (Salary = NULL) | UNKNOWN | NO |
NOT (Salary <> NULL) | UNKNOWN | NO |
Salary = 1000 | UNKNOWN | NO |
Salary IS NULL | TRUE | YES |
Salary IS NOT NULL | FALSE | NO |
Salary = expression IS UNKNOWN | TRUE | YES |
2 つの異なるテーブルのカラムを比較する場合、同じ規則が適用されます。そのため、2 つのテーブルを結合すると、比較したカラムに NULL 値があるローは選択されません。
数値式で使用する場合も、NULL 値は特別な性質を持っています。NULL 値が含まれる数値式の結果は、すべて NULL 値になります。NULL 値を数値に加算しても結果は NULL 値であり、数値にはなりません。NULL 値を 0 として扱う場合は、ISNULL( expression, 0 ) 関数を使用します。
SQL クエリの作成で生じるエラーの多くは、NULL の性質によるものです。注意して、このような問題を避けるようにしてください。探索条件の結合における 3 値的論理の影響の詳細については、探索条件を参照してください。
セット演算 (UNION、INTERSECT、EXCEPT) と DISTINCT 演算では、探索条件の場合と NULL の扱いが異なります。ローに NULL が含まれる場合、それ以外の場合でローが同じ場合、ローはこれらの演算の目的に対して同様に扱われます。
たとえば、テーブル T1 で、redundant というカラムのすべてのローに NULL が含まれる場合、次の文は 1 つのローを返します。
SELECT DISTINCT redundant FROM T1; |
データベースに接続されている必要があります。
なし
SQL/2003 コア機能。
Sybase Adaptive Server Enterprise では、一部のコンテキストで NULL が値として扱われますが、SQL Anywhere では値として扱われません。たとえば、SQL Anywhere の場合、次の WHERE 句では、NULL であるカラム c1 のローはクエリの結果に含まれません。これは、条件に値 UNKNOWN があるためです。
WHERE NOT( C1 = NULL ) |
Adaptive Server Enterprise の場合は、条件が TRUE と評価され、カラムのローが返されます。互換性を保つには、比較演算子ではなく IS NULL を使用してください。
SQL Anywhere のユニーク・インデックスは、エントリに NULL があってもよい点を除き、Adaptive Server Enterprise の場合と同じです。Adaptive Server Enterprise では、そのようなエントリをユニーク・インデックスに入れることはできません。
jConnect を使用する場合、tds_empty_string_is_null オプションは、空文字列が NULL 文字列または 1 つのブランク文字を含む文字列として返されるかどうかを制御できます。
詳細については、tds_empty_string_is_null オプション [データベース]を参照してください。
次の INSERT 文は、Borrowed_book テーブルの date_returned カラムに NULL を挿入します。
INSERT INTO Borrowed_book ( date_borrowed, date_returned, book ) VALUES ( CURRENT DATE, NULL, '1234' ); |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |