③クライアントC からの問い合わせ
続いて,
- 条件:
「在庫管理」 と 「製造」 の両方のスキルを持っている, または 「会計」 のスキルを持っている人材
今度は
(「在庫管理」 AND 「製造」)OR 「会計」
これも考え方は②のときと同じです。ORは,
リスト6 「在庫管理」
SELECT candidate_id
FROM CandidateSkills
GROUP BY candidate_id
HAVING ( MAX(CASE WHEN skill_code = '在庫管理' THEN 1 ELSE 0 END)
* MAX(CASE WHEN skill_code = '製造' THEN 1 ELSE 0 END))
+ MAX(CASE WHEN skill_code = '会計' THEN 1 ELSE 0 END ) >= 1; (=でないのが重要!)
図9 リスト6の出力結果
candidate_id ------------ 100 200 400 500
先ほどと同様,
図10 スキルの保有有無によるビットフラグ
candidate_ (就業希望者ID) | 在庫管理フラグ | 製造フラグ | 会計フラグ | (在庫管理フラグ*製造フラグ)+会計フラグ |
100 | 1 | 1 | 1 | 2 |
200 | 1 | 0 | 1 | 1 |
300 | 0 | 1 | 0 | 0 |
---|---|---|---|---|
400 | 1 | 1 | 0 | 1 |
500 | 0 | 1 | 1 | 1 |
今回は条件に
- 整数で真理値を代用した場合の結果判定のルール
- 真:1以上
- 偽:0
そのため,
このように,
終わりに
今回は,
- 標準SQLには真理値型も定義されているが,
サポートしているDBは少ない - その理由は,
SQLの真理値がunknownという第3の値まで持つ独特の体系 (3値論理) であるため - NULLとunknownは厳密には異なるのだが,
PostgreSQLはこれを混同している - NULLと空文字は厳密には異なるのだが,
Oracleはこれを混同している - しかたないので,
現在のところ, SQLで論理演算をしたいときは, 0/ 1のビットフラグでビット演算をするしかない
最後に,
参考資料
- ミック
『達人に学ぶSQL徹底指南書』 (翔泳社,2008) 「1-3 3値論理とNULL」 では, SQLにおける3値論理演算がどのように行われるか, そしてそれがいかにSQLに混乱をもたらすかという点を詳細に解説しました。本稿と併せて読むとよいでしょう。 また,
なぜSQLがそもそも真理値に3つ目の値を持ち込むことになったのか, という歴史的な事情を知りたい人は 「2-8 神のいない論理」 を参照してください。 - ミック
「3値論理とNULL」 そもそもなぜSQLにunknownという第3の真理値が存在するのか,
という理由を知りたい方は, こちらの記事を参照。NULLがSQLの演算に含まれた場合の危険性についても解説しています。 - 明智重蔵
「OracleSQL パズル 9-22」 Joe Celkoの
『SQLパズル 第2版』 (翔泳社) の 「パズル17人材紹介会社」 に対して, HAVING句で真理値演算を行う解答が解説されています。本稿を書くうえで参考にさせていただきました。
COLUMN NULLとゼロの違い
先のコラムではNULLと空文字の違いについて取り上げましたが,
SQLのNULLには,
3 - NULL = NULL
1 + (2 * NULL) = NULL
4 / NULL = NULL
これだけでも十分に気味が悪い話ですが,
5 / 0 -> Erorr!
NULL / 0 = NULL -> Errorにならず!
このように,
ちなみに,
- 文字列に空文字を結合しても結果が変化しない
‘ABC’ || ‘’ = ‘ABC
- 文字列にNULLを結合すると結果がNULLになる
‘ABC’ || ‘’ = NULL
空文字は,
NULLは,