PostgreSQL 8.1でCASEでNULL

のわー本番環境にリリースしたら動きが違う。

サーバ用意するお金がないのでテストDBは前のプロジェクトの使いまわしで、バージョン7.x、本番は8.1。で、CASEでのNULLの扱いが違う。

すんごく単純化するとこう云うの。

SELECT
    CASE null
    WHEN null THEN 'null'
    ELSE 'not null' END;

7.xだと「null」と表示されますが、8.1だと「not null」と表示されます。

三値論理からすると、8.1の動きの方が正しい、と思う、多分。NULLなんだから、「それはNULLか?」と聞かれても「そんなの知るか(unknown)」と返されて然るべきで、「その通り(true)」と返すのは間違い、ですよね。

いやーしくった。「WHERE hoge = NULL」って書くのと同じ位初歩的なミス。

一瞬単純にCOALESCEかまして逃げようかと思ったけどこうすりゃいいや。

SELECT
    CASE null IS NULL
    WHEN TRUE THEN 'null'
    ELSE 'not null' END;

それにしても三値論理なんて、id:habuakihiroさんの所読んでなかったら知らなかった。助かった。知らなかったらはまる所だった。マスタデータとか全部調査する所だった。

で、はぶさんの所のコメント欄であった、三値論理使ってWHERE句を生成するSQL、確か上手い事動かなくて残念ってオチだったと思うけど、8.1で三値論理にタイトになってるみたいだからもしかしてちゃんと動くんじゃないか、と思って探したけど見つからず。うーむ。