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
に関する特異性は、インデックスにも同様にあるのです。