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

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

SELECT dummy
     , dummy || ''
     , dummy || NULL
  FROM dual

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

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

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

目次

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

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

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

前へ次へ

You can’t learn everything in one day. Subscribe the newsletter via E-Mail, Twitter or RSS to gradually catch up. Have a look at modern-⁠sql.com as well.

著者について

Markus Winandの写真

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

彼の本

カバー『SQLパフォーマンス詳解』

核心をわかりやすく 解説。

Markusから購入します
(送料無料+PDF)

Amazon.co.jpで購入
(印刷版のみ)

Connect with Markus Winand

Markus Winand on LinkedInMarkus Winand on XINGMarkus Winand on Twitter
“Use The Index, Luke!” by Markus Winand is licensed under a Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License.
法律上の通知 | お問い合わせ | 無保証 | 商標 | プライバシーとGDPR | CC-BY-NC-ND 3.0 license