こんにちは。
エンジニアもどきにもなれない謎の初号機X(エックス)です。
こちらの記事は金属加工プラットフォームを開発・運用するCatallaxyのCatallaxy Advent Calendar 2021の第17日目の記事となります。
私より前の方々たちは随分と楽しい記事(おもしろいかはともかく)を書かれていたようでハードルが高くなってしまいましたが、この辺りで下げ気味にしてあげましょう。
何について書くか?そんな悩んでいませんが、人生初のSQLを書いた際にnullにハマった話でもしましょう。
SQLでnullにハマった話
「~を含まない」文字列検索をしようと、下記のようなSQLを書きました。
ここでは仮に、「あいう」とします。
select hogehoge
from fuga
where foo not like '%あいう%'
しかし、期待していた通りの結果は得られませんでした。
上記の例では条件がnot likeのみとなっていますが、当時、他にもwhere句に条件を指定していたので、どこが原因なのかがわかりませんでした。
where句に書いてある条件をひとつずつコメントアウトしていき、調査したところ、どうやらnot likeが悪さをしている様子。
ヒットしてほしいのにヒットしてくれないレコードを抜き出して見てみると、何もデータが入力されていないものがヒットしていないようです。
何もデータが入っていない...つまりnullです。
わたしはこの時気づきました。
『あれだけ「nullは要注意」と本で読んだじゃないか....!!!!!!!!!!!!!!』
NULLが存在する場合の条件判定は大変複雑になり、おまけに明らかに私たちの間隔に反する動作をします。そのため、データベース界の有識者たちの間では「なるべくNULLを使うべきではない」ということが共通認識になっています。
引用元:SQL第2版 ゼロからはじめるデータベース操作
他にも、
- NULLを含んだ計算は問答無用でNULLになる
- NULLに比較演算子は使えない(is nullを使おう!)
というようなことがこの本には書いてあります。
nullはとても特別な子なのです。
nullは論理演算子においてもtrueにもfalseにもならないので、絞り込みから漏れてしまうとのこと。
本を読んでいた当時は「ふーんそうなんだ~」レベルでしたが、今回身を持って実感しました。
最終的にどのように解決したかというと、下記で突破できました。
select hogehoge
from fuga
where foo not like '%あいう%' or foo is null
比較演算子はnullには使用できませんので、foo = nullは不正解です。
ちなみに、本に記載のあったように、『「なるべくNULLを使うべきではない」ということが共通認識』ということはなさそうです。
現在、筆者はER図を勉強中ですが、絶対nullを発生させないように...!とテーブルを分けまくってER図を設計したら「分けすぎるとテーブル結合をしまくらないといけないからそこまで分けなくていい」と、オンラインスクールのメンターにフィードバックされていた生徒を見ました。
実際弊社でもNULL値が入っているテーブルはあるようです。
やはり机上の勉強だけではなく、現場で行うことは大切ですね。
筆者は何者?
いかがでしたでしょうか。
プログラマーの方から見れば、拙い文章だったかもしれません。
実は筆者の職種はエンジニアではございません。
普段はセールスという営業ポジションにて働いています。
なぜエンジニアたちのアドベントカレンダーに参加しているのか。
フィヨルドブートキャンプ(以下、フィヨルド)というオンラインスクールに会社の福利厚生で通わせていただいているため、半ば強制...ではなく、自ら喜んで参加させていただきました。
本記事に記載したSQLについても、フィヨルドに通ったことがきっかけで書き始めました。しかしSQLはプログラミングのほんの一部に過ぎません。それだけのために入学する決断をするのはもったいないでしょう。わたしは、プログラミングをやって行くにつれて、エンジニア陣との共通言語が増えたことがとても嬉しいです。
自分も一味違う営業になりたい!と思った方は一度採用情報をご覧ください。
もちろん、ただの福利厚生制度なのでプログラミングを学ぶのは全く持って必須ではないのでご安心を。あなたなりの「一味」を見つけてください。
株式会社Catallaxy 採用募集ページ:https://open.talentio.com/r/1/c/catallaxy/homes/2947
一連のアドベントカレンダーを書いているような、様々な社員があなたをお待ちしております。
今後のアドベントカレンダーもお楽しみください。