SQLアタマアカデミー

第8回 SQLにおける論理演算~なぜ真理を隠すのか~ (1)各DBの真理値型のサポート

この記事を読むのに必要な時間:およそ 3 分

なぜunknownが存在し,NULLとは扱いが異なるのか

なぜSQLがunknownという奇妙な値を持っているかという理由は,本稿では詳細は省略しますが,重要な結論だけを述べると,NULLとunknownはまったく別物であり,これらを混同してはならない,ということです。

というのも,unknownというのはそもそも,値ではないNULLと通常の値を比較できないために(しかたなく)持ち込まれた真理値であるからです。じゃあNULLは何なのか,という疑問が当然出ると思いますが,これに対する答えは,NULLとは「ここには値がない」という文(statement)だ,というものです。ただ,画面の表示上,⁠ここには値がない」という文章では幅を取るので「NULL」という簡潔なマークで代用しているだけです。これがなんとなく人間の目にはデータの値のように見えてしまうのは,ただの錯覚です。

したがって,せっかく真理値型をサポートするという先駆的な仕事をしてくれたPostgreSQLには悪いのですが,NULLでunknownを代用しては本末転倒です。

逆にこの観点から見ると,なぜデータベースがいずれも真理値型という基本的なデータ型のサポートに消極的か,という理由もほぼ推測がつきます。それは,unknownがあるからです。

世の中の大半のプログラマやSEは,真理値といえばtrueとfalseの2値しかないと考えています。そこに3値目を持つSQL独自の真理値型を導入したら,混乱を招くのは必定(ひつじょう)です。何しろ,図2に示すように,3値の論理演算は2値の論理演算に比べて非常に複雑で,すっと直観的に把握できるものではありません。ANDとORの演算の組み合わせ数は,2値論理の22=4から,32=9と倍以上に増えてしまいます。

それに加え,3値目のunknownがNULLと勘違いされやすいときています。こうしたいくつもの悪条件によって,どのデータベースも,SQLに真理値はなかったことにしたいという気持ちが生まれても,無理からぬところはあります。

図2 3値論理の真理表(網掛け部分が3値論理特有の演算)

図2 3値論理の真理表(網掛け部分が3値論理特有の演算)

COLUMN NULLと空文字

NULLはunknownと勘違いしやすい記号ですが,もう1つ,NULLとよく混同しがちなのが空文字,つまり長さがゼロの文字型のデータです。NULLは空文字とも別物です。だから,図aのようなテーブルにおいて,両者は別のデータとして扱われます。

図a  EmptyString(空文字テーブル)

es
(空文字)
NULL
 
空文字の挿入
  • INSERT INTO EmptyString VALUES ('');
NULLの挿入
  • INSERT INTO EmptyString VALUES (NULL);

したがって,このテーブルから空文字を選択したい場合は,⁠es = ''」を条件とすればOKですし,NULLを選択したい場合は,⁠es IS NULL」を条件とします。次の2つのクエリは,どちらも件数1を返します。

空文字の件数を選択
  • SELECT COUNT(*) FROM EmptyString WHERE es = '' GROUP BY es;
NULLの件数を選択
  • SELECT COUNT(*) FROM EmptyString WHERE es IS NULL GROUP BY es;

ここまでは別に混乱はありません。空文字は,数値型でいうゼロに相当するデータですので,たとえ目には見えなくてもNULLとは違う,ということはご理解いただけるでしょう。しかし,ここであえてこのテーマを取り上げたのは,大きなシェアを占めるDBMSであるOracleが,両者を混同しているからです。Oracleでは,空文字がNULLとして扱われます。そのため,2つのクエリのうち,Oracleは,前者の件数を0,後者の件数を2と返します。

この標準SQL違反の動作をするDBはOracleだけです。かつ,Oracle社もおそらくこの点を修正したいと考えている節が,マニュアルの記述から窺(うかが)えます注a⁠。いずれ近い将来,現行仕様が変更される可能性があるでしょう。

注a)
「現在,Oracle Databaseは,長さが0(ゼロ)の文字値をNULLとして処理します。ただし,この処理はOracleの今後のバージョンでも継続されるとはかぎらないため,空の文字列をNULLとして処理しないことをお勧めします。」Oracle Database SQL 言語リファレンス 11g リリース1(11.1)⁠)

著者プロフィール

ミック

SI企業に勤務するDBエンジニア。主にデータウェアハウス業務に従事している。自身のサイト「リレーショナル・データベースの世界」でデータベースとSQLについての技術情報を公開している。『Web+DB Press』で「SQLアタマアカデミー」を連載中。

著書:『達人に学ぶ SQL徹底指南書』(翔泳社、2008)訳書:J.セルコ『SQLパズル 第2版』(翔泳社、2007)

SQLアタマアカデミー:サポートページ