NULL とは

フィールドの値がない(空である)場合にヌル(またはナル、以後 ヌルと記述)である、または、ヌルを含むという。 ヌル文字 "\0"と異なる。しかし、長さ 0 の文字列 とは同じ。

以下のSQLを実行すると NULL と CHR(0) は違うことがわかる。CHR(0) をデータの一部として格納もできる。

SQL> SELECT LENGTH(CHR(0)||'A'||CHR(0)) FROM DUAL ;

LENGTH(CHR(0)||'A'||CHR(0))
---------------------------
                          3

SQL> SELECT '\0 IS NOT NULL' FROM DUAL WHERE CHR(0) IS NOT NULL ;

'\0ISNOTNULL'
----------------------------
\0 IS NOT NULL

SQL> SELECT '\0 IS NULL' FROM DUAL WHERE CHR(0) IS NULL ;

レコードが選択されませんでした。

長さ0の文字列

最近のオラクルのマニュアル上では 長さ0の文字列('') がヌルと等価になってしまうことを以後のバージョンでも継続することを保証していないと明言している。 また ヌルを含む可能性がある文字列の場合 長さ0の文字列 へ明示変換を推奨している。 しかし、そのような対応コードを現在では意味がないので意識して区別していることが少ないのでは?というのが現実である。
もし、ヌルと 長さ0の文字列 を区別し始めた場合には 2000年問題並の対応コストがかかると思われる。(完全な人海戦術でソース見直し)
仕様変更がアナウンスされたりすると、ちょっとした騒ぎになるかもしれない。

例) INSERT INTO dest_table
         SELECT NVL(NULLIF(col1, col2), '') FROM source_table ;

アトミック・ヌル (ATOMIC NULL)

アトミック・ヌルは、マニュアル上では基本構造的ヌル(原文: Atomically Null)と書かれている。 通常のヌルは Native な データ型 について値が NULL であることをあらわす。

一方、アトミック・ヌルは コレクション型レコード型 などのコンテナオブジェクトにおいて利用するワードである。例えばレコード型において、すべての要素が NULL に初期化されている状態(※1) はアトミック・ヌルにはならない。 レコード型の本体がインスタンス化(実体化?)されていないヌル(ポインタが NULL といえば分かりやすい?)の状態を特別にアトミック・ヌルという(単にヌルといっても問題はないと思う)。
ヌルとアトミック・ヌルは双方とも IS NULL を使用することでヌルか否かを判断することができる(※2)。 (アトミック・ヌルの状態のコンテナの要素に値を設定すると COLLECTION_IS_NULL 例外 が発生する。)

(※1) すべての要素が NULL に初期化されている状態を呼称する名称はマニュアルにあるかどうかは不明であるが、 個人的には、EMPTY (カラ)であるという表現を用いている。

(※2) 結合配列(索引付き表)の場合、コンテナ本体が実行時にインスタンス化されているため、任意の位置に要素を設定できる。そのため定義しているだけで初期化されていなくても IS NULL で判別できないし、 コンストラクタなしに代入しても COLLECTION_IS_NULL 例外 は発生しない。

 


NULL に関連する内容

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle Web セミナー