Null
null
やnil
といったキーワード︵予約語︶あるいは識別子︵定数名︶などの意味がどういったものかは言語による。場合によっては同じ言語であっても処理系の実装[要出典]や言語バージョンごとに違うことさえある。ポインタや参照のある言語では、ヌルポインタまたはヌル参照などと呼ばれる何も指さない特別なポインタや参照であることもあるし、Pythonのようにオブジェクトのひとつであることもある[注釈 1]。古典的なLISPのように真理値の偽︵の代表︶や空リスト﹁()
﹂を兼ねたもの︵それらと同じもの︶だったりすることもある。
語源[編集]
![]() | この節の出典は、Wikipedia:信頼できる情報源に合致していないおそれがあります。 |
ヌルポインタ[編集]
ポインタや参照が無効であることを示す。C言語では無効ポインタを表現するための特別な値として、処理系定義のNULL
マクロが用意された[10]。Cの規格ではNULLポインタの内部数値は0とは規定されていないが、0をポインタ型にキャストするとヌルポインタになることは規定されているので、代表的な実装では以下のようになっている。
#define NULL ((void*)0)
またC言語から派生したC++では、C言語から引き継いだNULL
マクロ定義が存在するが、Cとは違ってvoid*
から他の型へのポインタに暗黙変換することを禁止したため、C++03規格までは以下のように整定数0に等しかった。
#define NULL 0
int
の0と型システムの上では同じになるため、しばしばオーバーロードの呼び間違いが生じることとなった。これを解消するためC++11規格では専用のstd::nullptr
_t
型を持つリテラルを表すnullptr
キーワードが導入され[11]、NUL
L
マクロは処理系定義となった[12]。
JavaやC#に代表されるように、C++以後の言語ではnullを最初から専用構文として導入した事例が多い。
その他のヌル[編集]
PythonではNone
という名前で、その値は組み込みオブジェクトである。バージョン2.4からNone
には代入できなくなった。
Rubyではnil
という予約語[13]で、意味は組み込みオブジェクト︵NilClass
の唯一のインスタンス[14]︶である。
VB.NETではNothing
というキーワードで、任意のデータ型の既定値を表す[15]。
LISPではNIL
で、どれでも同じようなものだが実体の詳細は様々で、carやcdrをとるとそれぞれでまたnilが返ってくる実装もあればエラーになる実装もある︵普通はnilかどうかをまずテストして、carやcdrしないようにする︶。
null型[編集]
構文上、nullは多くの言語で特別なnullリテラルという扱いだが、リテラルのための型﹁null型﹂︵またはNull型、NULL型とも︶が規定される言語が存在する。null型の値はnullのみが許される。 プログラミング言語の文法上null型が存在するケースでは、一般的な型同様にnull型を用いることが出来るが、null型を扱えない言語も存在する。 例えばJavaでは﹁null型﹂はあるが、ユーザーコードで利用することはできない。言語仕様では、nullリテラルはnull型であり、null型には名前がなく、null型の変数宣言やnull型へのキャストをすることは不可能である、という扱いとなっている。以上より、null型は内部的に存在するが、構文などの上でそれを扱うことができず、その値を表すリテラルのみが存在する[16]。ヌル文字[編集]
ヌル文字列[編集]
nullデバイス[編集]
データベースのNULL[編集]
![]() |
SQLのNULL[編集]
NULL を含む演算の結果[編集]
NULLを含む演算の多くは結果がNULLとなる。例えばNULL + 1
NULL / 0
NOT NULL
NULL AND TRUE
LENGTH(NULL)
NULL = NULL
NULL <> NULL
NULL = 1
NULL <> 1
NULL < 1
NULL IN (1, 2, 3)
NULL IN (1, 2, NULL)
NULL AND FALSE
NULL OR TRUE
はそれぞれFALSE、TRUEである(NULL AND TRUE、NULL OR FALSE がNULLになるのとの違いに注意)。
Oracleは空文字列とNULLを区別しないため、NULL あるいは空文字列を含む演算で非標準な結果となることがある。例えば、文字列と NULL を連結すると本来は NULL になるが、Oracleでは文字列の値を変えない(ただし NULL 同士の連結は NULL になる)。
'A' || NULL -- IS NULL, ただし Oracle では = 'A'
NULL || NULL -- IS NULL
NULLを扱うための工夫[編集]
テーブルの各列には、NULLを保持できないと指定することができる。例えば、全ての行で必ず異なる値が含まれなければならないと指定されている列であっても、複数の行がNULLを保持できてしまう。そこで、この列にNULLを保持できないと指定すればこの問題が回避できる。
ソートでは、NULLはいかなる値よりも小さいとして扱われる(ただしOracleは逆にいかなる値よりも大きいとして扱われるが、オプションで変更できる)。しかし論理値でのソートが実装されていれば、以下のように IS (NOT) NULL を第1のソートキーに使ってNULLを先または後に変更できる。
ORDER BY col IS NOT NULL, col -- NULLは最初
ORDER BY col IS NULL, col -- NULLは最後
また、CASE式やCOALESCE関数(あるいはOracleならNVL関数も可)を使って、NULLに任意の値を割り当ててソートすることができる。以下の句はいずれも、colがNULLならば0を割り当ててソートする。
ORDER BY CASE WHEN col IS NULL THEN 0 ELSE col END
ORDER BY COALESCE(col, 0)
ORDER BY NVL(col, 0) -- Oracleのみ
脚注[編集]
注釈[編集]
- ^ 証拠として例えば
None.__str__()
のように参照できる。