2005-10-28

OracleのNULL

Ethna進んでないぞ!っていうツッコミが来そうですが、週末までお待ちください。。。

さて今日業務で、OracleのNULLでちょっと引っかかったのでメモ。

A,BというColumnがあって、
「AとBが等しくない」→ AかBのどちらかがNULLでも出力する
というWhere文がなかなかできない。

Where NVL(A,'') <> NVL(B,'')

でできそうだけど、それだとAかBにNULLがあるとダメ。
えーなんでー(つд⊂)エーン
とおもってたら

以下のSAKさんの文章

Oracle PL/SQL 編1 - 注釈、識別子、引用句、変数、演算子、比較演算子 - SAK Streets
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/sq_pl01.htm

NVL(a,'')はNULLになってしまうらしい!ショック。
SAKさんの文章ではPL/SQL内だけとあるが、普通にSQLだけでもダメみたい。
但しPL/SQL Developer 使ってるからPL/SQL扱いになってるのかな。

ためしに
select NVL(NVL(NULL,''),'NULL') from dual;
というSQLを試してみてください。
これを実行するとNULLが返ってきます。
NVL(NULL,'') = NULLなわけですね。

で解決法ですが、

Where NVL(A,'あほ') <> NVL(B,'あほ')

です。
''ではなくてなにか文字列をいれて'あほ'としてやればいいわけですね。

実際の業務ではこわくてできないので、

Where NVL(A,' ') <> NVL(B,' ')

としました。(ヘタレ?)
コメントを投稿