1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SQLでnullにハマった話

Last updated at Posted at 2021-12-17

こんにちは。
エンジニアもどきにもなれない謎の初号機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

一連のアドベントカレンダーを書いているような、様々な社員があなたをお待ちしております。

今後のアドベントカレンダーもお楽しみください。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?