コードロード

エラー討伐

【SQL】3値論理とNULL(NULLにいじめられないために)

達人に学ぶSQL徹底指南所の学習記録です。

データベースにnullが一つでも含まれれば、クエリから正しくない結果が返される可能性がある。

とりあえずこれは覚える!

f:id:naka_no_mura:20220206102129p:plain

3つの真理値の間には、下記の優先順位がある。

強い方が弱い方を飲み込む。

  • 例1:「true AND unknown」なら、unknownの方が強いので、結果はunknown。
  • 例2:「true OR unknow」なら、trueの方が強いので、結果はtrue。
  • 特に、AND演算にunknownが含まれたら、結果が絶対にtrueにならない。

ポイント

  • NULLは値ではない
  • 値ではないので、述語もまともに適用できない
  • 無理やり適用するとunknownが生じる
  • unknownが論理演算に紛れ込むと、SQLが直観に反する動作をする
  • これに対処するには、段階的なステップに分けてSQLの動作を追うことが有効

対応方法

  • CASE式等を使ってNULLを何からの値に変換するか
  • テーブルにNOT NULL制約をつけて極力NULLを排除する