SQLアタマアカデミー
第8回 SQLにおける論理演算~なぜ真理を隠すのか~ (2)SQLでブール式を使うと
SQLでブール式を使うと
真理値型をサポートしているDBMSの場合
各DBMSにおける真理値型のサポートが遅れているという状況は,SQLの文法にも影響を与えています。たとえば,こんな簡単なクエリですら問題が起きます。図3の人名と住んでいる国のテーブルから,日本に住んでいるかどうかを結果に出力したいと思います。
図3 人名,住んでいる国テーブル
| name (名前) | state (国) |
| 太郎 | Japan |
| ジョン | USA |
| カール | Germany |
| ギャビー | Mexico |
| 源三郎 | Japan |
| パオロ | Italia |
もしSQLがSELECT句でブール式の評価をサポートしていれば,リスト1のクエリは問題なく通るはずです(図4)。
リスト1 君,日本に住んでいる?
SELECT name,
(state = 'Japan') AS Livin_in_Japan
FROM Names;
図4 リスト1の結果
name Livin_in_Japan --------- ---------------- 太郎 true ジョン false カール false ギャビー false 源三郎 true パオロ false
真理値型をサポートしていないDBMSの場合
しかし,ご想像のとおり,このクエリが通るのはPostgreSQLとMySQLのみです(MySQLの場合,結果の表示が0/1で行われます)。残るDBは真理値をサポートしていない以上,結果セットの中に真理値が含まれることを許容するわけもないので,エラーになります。
もし真理値をサポートしないDBで同じような結果が欲しいと思うなら,リスト2のようにCASE式で無理やり文字型として返すしかないでしょう。
リスト2 君,日本に住んでいる? (真理値もどき)
SELECT name,
CASE WHEN state = 'Japan'
THEN 'true' ELSE 'false' END AS Livin_in_Japan
FROM Names;
これはすべてのDBで実行できます。ただし,あくまで文字列として「true」とか「false」と書いているだけですので,この値を使ってAND/ORの論理演算ができるわけではありません。
これはDBエンジニアにとって大きなデメリットです。プログラミング言語から論理演算を奪うというのは,片手を縛ってボクシングをするようなものです。何とかうまい方法はないものでしょうか。
ビット演算で代用する
実はここに1つ,代替となる方法があります。それは,MySQLも部分的にやっているように,0/1の整数値によるビット演算で論理演算を代用することです。
- 論理演算 ビット演算
- AND → かけ算
- OR → 足し算
そうすると,「false AND true = false」は「0 * 1 = 0」と等価ですし,「true OR false = true」は,「1 + 0 = 1」と等価になります。気をつけなければならないのは,「true OR true = true」を模倣する「1 + 1」の結果が2になってしまうことです。これは,DB側にビット型というデータ型があるわけではなく,ただの整数値を使っているだけですので,しかたありません。ともあれ,少々すっきりしないものの,これでSQLで論理演算を行うことが可能になります。
それでは,SQLで論理演算を駆使した場合,どのような応用が可能になるか,見ていきましょう。
SQLアタマアカデミー
- 最終回 OLAP関数で強力な統計処理を実現!―手続き型から理解するSQL (5)集合指向と手続き型
- 最終回 OLAP関数で強力な統計処理を実現!―手続き型から理解するSQL (4)OLAP関数と集約関数を組み合わせる
- 最終回 OLAP関数で強力な統計処理を実現!―手続き型から理解するSQL (3)OLAP専用関数
- 最終回 OLAP関数で強力な統計処理を実現!―手続き型から理解するSQL (2)OLAP関数の基本構文
- 最終回 OLAP関数で強力な統計処理を実現!―手続き型から理解するSQL (1)OLAP関数とは何か
- 第10回 結合大全 (5)非等値結合
- 第10回 結合大全 (4)自己結合
- 第10回 結合大全 (3)外部結合
- 第10回 結合大全 (2)内部結合
- 第10回 結合大全 (1)クロス結合

