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 の性質によるものです。注意して、このような問題を避けるようにしてください。
SQL では、探索条件内での NULL との比較の結果は UNKNOWN となります。ただし、2 つのローがそれぞれの重複であるかどうかを判別する場合、SQL は NULL を NULL と等しいものとして処理します。これらのセマンティックは、集合演算子 (UNION、INTERSECT、EXCEPT)、GROUP BY、WINDOW 句内 PARTITION、および SELECT DISTINCT に適用されます。
たとえば、テーブル T1 で、redundant というカラムのすべてのローに NULL が含まれる場合、次の文は 1 つのローを返します。
SELECT DISTINCT redundant FROM T1; |
データベースに接続されている必要があります。
なし。
SQL/2008 コア機能。
Transact-SQL Adaptive Server Enterprise では、一部のコンテキストにおいて NULL 値との比較の処理が異なります。expression が等号または不等号を使用して変数または NULL リテラルと比較され、expression がベーステーブルまたはビューのカラムを参照する単純な式である場合、NULL = NULL が UNKNOWN ではなく TRUE を返す 2 値的論理を使用して比較が実行されます。これらのセマンティックで考えられる比較とそれに相当する SQL/2008 の比較のリストを以下に示します。
Transact-SQL の比較 | SQL/2008 の対応する比較 |
---|---|
expression = NULL | expression IS NULL |
expression != NULL | NOT (expression IS NULL) |
expression = variable | expression = variable IS TRUE OR (expression IS NULL AND variable IS NULL) |
expression != variable | expression != variable IS TRUE AND ( NOT expression IS NULL OR NOT variable IS NULL) |
SQL Anywhere では、ansinull オプションが OFF に設定されている場合、これらのセマンティックを実装して、Adaptive Server Enterprise の動作と一致させます。Open Client 接続と jConnect 接続では、ansinull オプションはデフォルトで OFF に設定されます。SQL/2008 のセマンティックを保証するには、ansinull オプションを ON にリセットするか、等号比較の代わりに IS [NOT] NULL 述部を使用します。
SQL Anywhere のユニークインデックスは、エントリに NULL があってもよい点を除き、Adaptive Server Enterprise の場合と同じです。Adaptive Server Enterprise では、そのようなエントリをユニークインデックスに入れることはできません。
jConnect を使用する場合、tds_empty_string_is_null オプションは、空文字列が NULL 文字列または 1 つのブランク文字を含む文字列として返されるかどうかを制御できます。
次の INSERT 文は、Borrowed_book テーブルの date_returned カラムに NULL を挿入します。
INSERT INTO Borrowed_book ( date_borrowed, date_returned, book ) VALUES ( CURRENT DATE, NULL, '1234' ); |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |