自分の感覚で Oracle を条件検索したときに遭遇した罠のお話です。おそらくは、同様の状況になったこともあるとは思うのですが、記憶は全くありません。(はっ、もしや、バグが混入したまま動いてるのでしょうか?というよりも、バグのないシステムなどありません)
スポンサーリンク
値が NULL でもレコードが期待通りに抽出できると思っていたSQL
次のような酔っ払いテーブルがあったとします。
名前 | 年齢 | 性格 |
---|---|---|
吉幾三 | 64 | エロい! |
まさお | (NULL) | 性格もイケメン |
ゆきこ | 55 | 暴力ゴリラ |
次のSQLでは、まさおのレコードは抽出できません。決してブログ内で年齢を18歳と偽っている(非公表)から取得できないわけではありません。Oracle には、今はまだ人工知能は装備されていないと思いますので、命令通りに動作します。人工知能が搭載されると年齢を探り当てて取得できるようになることでしょう。
なお、まさおはゆきこに、また殴られるかもしれません。
-- 100歳以外の酔っ払いを取得する select まさお from 酔っ払い where 年齢 <> 100
NULL も抽出する
値が NULL の場合でも抽出するようにするには、次のように記述します。
-- 100歳以外の酔っ払いを取得する(年齢非公表も取得する) select まさお from 酔っ払い where 年齢 IS NULL or 年齢 <> 100
データベースが人工知能を持ったら
よくよく考えると、データベースが人工知能を持つとデータがネット上のコンテンツの場合はグーグルになっちゃいますね。グーグルもうかうかしてられません。
しかし、今は人工知能(AI)分野でも、グーグルが全力で先頭足ってる印象を受けますので、むしろ差は開くばかりなのかもしれないです。
orz やはり記憶力がない
ここまで書いて、絶対に同じような内容のページあるだろうと思い探してみたら出てきました。折角なのでこのページの内容も残しておきます。リンク先の投稿日時が比較的最近なのは、前サイトの内容を移転させたためです。おそらく、5年位前(適当、あてにならない)の内容です。
↓
- [ Oracle ] SQL の null 判定は等号(=)、不等号()ではなく is null, is not null
- [ Postgres ] 文字列と NULL は比較演算子で比較できない ( is null )
- [ Oracle ] null 値のソート順を制御 ( NULLS FIRST / NULLS LAST )