by Hayato Matsuura.

OracleにおけるNULL


SQLのNULLが混乱の原因になるのはよくあることです。 データがないことを 示すNULLの基本的な考え方はシンプルなものですが、 独特な点がいくつかあります。例えば、= NULLの代わりに IS NULLを使わなくてはならないのもその1つです。さらに Oracleにおいては、それに加えてNULLの特異な点が存在します。 1つは、SQL標準では要求されていないNULLの扱いがあること、 もう1つは、インデックスにおいてNULLが「特別な」扱いを 受けることです。

SQL標準では、NULLは値としてではなく、未知の値に 対するプレイスホルダとして定義しています。そのため、どんな値も NULLになることはできません。その代わり、Oracleは 以下のように空の文字列をNULLとして扱います。

   SELECT     '0 IS NULL???' AS "what is NULL?" FROM dual
    WHERE      0 IS NULL
UNION ALL
   SELECT    '0 is not null' FROM dual
    WHERE     0 IS NOT NULL
UNION ALL
   SELECT ''''' IS NULL???'  FROM dual
    WHERE    '' IS NULL
UNION ALL
   SELECT ''''' is not null' FROM dual 
    WHERE    '' IS NOT NULL
what is NULL?
--------------
0 is not null
'' IS NULL???

さらに混乱することに、Oracleは以下のような場合はNULLを 空の文字列として扱います。

SELECT dummy
     , dummy || ''
     , dummy || NULL
  FROM dual
D D D
- - -
X X X

DUMMY列(常に'X'を含む)と NULLを連結すると、NULLを返すはずです。

NULLの考え方は、多くのプログラミング言語でも 使われています。それらのどれを見ても、Oracleのように空の文字列が NULLになることはありません。実際のところ、 VARCHAR2のフィールドに空の文字列を保存することは できません。やってみると、Oracleは代わりにNULLを 入れてしまいます。

この特徴は、奇妙なだけでなく危険でもあります。これに加え、 OracleのNULLに関する特異性は、インデックスにも 同様にあるのです。

目次

  1. NULLに対する インデックス - 全てのインデックスは部分インデックス

  2. NOT NULL 制約 - インデックスの使われ方に影響

  3. 部分インデックスを エミュレートする - 関数インデックスを使った方法

前へ次へ

著者について

Markus Winandの写真

Markus Winand氏は、開発者がSQLパフォーマンスを改善するお手伝いをしています。彼は、SQL Performance Explainedの 著者でもあり、出張トレーニングhttp://winand.at/での リモート講義も 行っています。

“Use The Index, Luke!” by Markus Winand is licensed under a Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License.
法律上の通知 | 接触 | 無保証 | 商標 | Privacy | CC-BY-NC-ND 3.0 license