Out of Memory

本ブログは更新を停止しました。Aerieをよろしくお願いいたします。

目次

Blog 利用状況

ニュース

2009年3月31日
更新を停止しました。引き続きAerieを御愛顧くださいませ。
2009年2月3日
原則としてコメント受付を停止しました。コメントはAerieまでお願いいたします。
詳細は2月3日のエントリをご覧ください。
2008年7月1日
Microsoft MVP for Developer Tools - Visual C++ を再受賞しました。
2008年2月某日
MVPアワードがVisual C++に変更になりました。
2007年10月23日
blogタイトルを変更しました。
2007年7月1日
Microsoft MVP for Windows - SDKを受賞しました!
2007年6月20日
スキル「ニュース欄ハック」を覚えた!
2006年12月14日
記念すべき初エントリ
2006年12月3日
わんくま同盟に加盟しました。

カレンダー

中の人

αετο? / aetos / あえとす

シャノン? 誰それ。

顔写真

埼玉を馬鹿にする奴は俺が許さん。

基本的に知ったかぶり。興味を持った技術に手を出して、ちょっと齧りはするものの、それを応用して何か形にするまでは及ばずに飽きて放り出す人。

書庫

日記カテゴリ

IS NULL なワケ?

SQLでは、NULLとの比較は = NULL ではなく IS NULL と書く。これは何故だろう?

NULL というのはデータではなく、データがないことを示すマークではないかと思う。
だから、「NULL との比較」ってのは実はおかしい。比較対象がないんだから比較できない。だから = じゃない。
でも「データがあるかないか」は調べられるし、調べられないと困る。だから IS という演算子があるんじゃないだろうか。

狙っていたわけではないけれど、ここで昨日のエントリが絡んでくる。

「Aさんの家とBさんの家には同じ車がある」という命題は、どちらか、または両方の家に比較対象になる車が無ければ真になる。
けれど同時に、「Aさんの家とBさんの家には違う車がある」も真になる。
どうしてこんな変なことになったかと言えば、比較対象が無いのに、無理に比較しようとしたからだ。
自然に考えれば「無いものとは比較できない」が正しい。
けど「無いかどうか」なら判定はできる。

というわけ…だったらいいなぁw

投稿日時 : 2007年6月19日 23:00

Feedback

# re: IS NULL なワケ? 2007/06/20 0:30 片桐

だって、NULLってデータじゃなくて、「データがない」っていう状態を指すんだし、中身を比較する「=」って有り得ないと思う(ぼそ)

# re: IS NULL なワケ? 2007/06/20 1:17 RUN

車のエントリの方でもチラリと書いたけど、何と比較してるかって辺りがポイントじゃないかな?

STRING型なんかだと、NULL以外にもNOTHINGの場合もISで比較とるよね

= NULL では無くて IS NULL なのはこういうことなんじゃないかと自分は理解してます(間違ってるかもだけど)

# re: IS NULL なワケ? 2007/06/20 10:13 taka

その話については僕は
http://www.geocities.jp/mickindex/index.html
のページで知りました。

# re: IS NULL なワケ? 2007/06/20 10:53 シャノン

> NULLってデータじゃなくて、「データがない」っていう状態

そのことに今さら気づいたということでww

> STRING型なんかだと、NULL以外にもNOTHINGの場合もISで比較とる

むう…何言語だろう…

> http://www.geocities.jp/mickindex/index.html

平易に書かれていていいですね。
一度通して全部読んでみよう。

# re: IS NULL なワケ? 2007/06/20 18:08 Ognac

[RDBの文字項目は長さ0の文字はNULLになる]という仕様があったりするので、NULLの扱いは要注意ですね

# re: IS NULL なワケ? 2007/06/20 19:27 RUN

>むう…何言語だろう…
一応、VB.net
まぁ、NOTINGは文字列がNOTINGなわけじゃなくて、格納してる(STRINGクラス)オブジェクトがNOTINGな訳だけど

# re: IS NULL なワケ? 2007/06/21 10:14 シャノン

VB.NET には NULL は無いというか、NULL と Nothing は同じものですだよ…。
NULL と NOTHING が両方ある言語かと思っちゃった。

# re: IS NULL なワケ? 2007/06/21 20:58 RUN

あれ? .netでNULLとNOTHINGって同じだったっけ?
ゴソゴソ(←試してる)
NULLはサポートしなくなりました、SYSTEM.DBNULLを使ってください。
ん?
ゴソゴソ(←DBNULLを試してる)
SYSTEM.DBNULLは型です、式には利用できません

… \(゜ロ\)(/ロ゜)/

まぁ、兎も角、色々な知識が交錯して何か勘違いしてたようですorz

今度、頭の中デフラグして出直してきます

# re: IS NULL なワケ? 2007/06/22 16:51 シャノン

あー。

VB.NET における Nothing と、C# の null は同じです(C# の null が小文字なのに注意。C# は大文字小文字を区別する言語です)。

C# の null と DB の NULL は違います。DB の NULL は .NET では System.DBNull として表されます。

# re: IS NULL なワケ? 2007/06/23 15:31 RUN

C系の言語が大文字小文字を区別するのわチャンと分ってますよ~

言語問わずに色んな知識を集めてたんでかなりこんがらがってたみたいで^^;

一応、最初の時点のイメージだと
char Hoge**
として
Hoge ← Nothingはここが無い
Hoge* ← NULLはここが無い
Hoge** ← ""(空文字)はここが無い
みたいな感じのイメージ。(クラスだから厳密にはかなり違うけど)
比較する位置が違うから、=を使うかISを使うかが変わるって言いたかったのよ~

# re: IS NULL なワケ? 2007/06/23 17:28 シャノン

> 最初の時点のイメージ

強いて言うなら、俺は逆かなー。
Hoge ← NULLはここが無い
Hoge* ← Nothingはここが無い
Hoge** ← ""(空文字)はここが無い
ってイメージ。
CではHoge** じゃなくて、**Hoge ですけど。

DBの列に何も入ってないことを示すNULLは、プログラミング言語におけるヌルポインタ、ヌル参照(C#のnull、VBのNothing)さえも入っていないこと、言い換えれば、ヌルポインタさえも有効なデータとみなすこと、というのをどこかで見た気がする。だから DBNull なんてものが別途あるのだと。

ただ、それを区別できるようになっていることが悪いとは言わないけれど、区別する必要のあるプログラムでだけ区別すればいいだけのこと。
.NET 2.0では、DBのNULLをNullable<T>として扱えるようになってなかったっけ?

で、混乱の元は、SQLとVB.NETを混ぜて話したことだと思う。
これね。
> STRING型なんかだと、NULL以外にもNOTHINGの場合もISで比較とる
VBにNULLはないし、SQLにSTRING型はないし、SQLのISとVBのISは(意味的には同じだとしても、言語が違う以上)違うものだし。

というか、VBがいくら大文字小文字を問わない言語だとは言え、全部大文字で書くのは、正直読みにくいです。
とか言いつつ、俺はSQLは全部大文字で書くのだけれど;;

タイトル
名前
Url
コメント