0は0, nullはnull

ちょっと暖かくなったなーと思えばすぐにまた寒くなりましたね。
もう花粉が飛んでる話もあって年によって症状の重さが変わる花粉症に怯える毎日です。
令和が擬人化されてポンコツ扱いされているのは見ていて面白いですが気温の上下は体調に来るものがあるのでやめてほしいところです。

さて、タイトルはSQLでめちゃくちゃ詰まった時に思い知ったことです。
とあるデータが表示されないというバグ報告を受けて自分でもデータを作成して再現させてみるが再現できず。
なぜか報告を受けたデータだけが表示されないということが起きていた。
そのデータをほかの表示されているデータと比較…
“あれ?該当データのこのカラムだけnullが入ってる? でもWHERE句で [ is not null ] ないしなー”
と思って深く調べなかった自分を小一時間問い詰めたいですね。

SELECT
  *
FROM
  SCHEDULE
WHERE
  (
    DATE < ‘2024-03-01’
    or DATE = ‘2024-03-01’
    or DATE >= ‘2024-03-01’
  )

これだと「DATE」がnullの時にWHERE句に引っかからずにnullのデータは弾かれてしまう。
今回の最終的な原因はDATEに当たる箇所がnullになっているからだ!と気づいてWHERE句に以下を追加することで取得できました。

  and DATE is null

「nullは比較演算子を使うときは0みたいなもんだろう」と勝手に思い込んでいたので思わぬところでかなり時間を使ってしまいました。