2017年10月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
無料ブログはココログ

« なっとう | トップページ | こんなところを車が通る? »

2008.06.10

DB2のNULLは定数ではない?

現在仕事でIBMのDB2というRDBを使っています。
これまでいくつかの(と言ってもMS-Accessを含めても4つか5つほどですが)RDBを使ってきましたが、DB2は意外なところで意外な仕様があったりして驚いています。

一番驚いたのは、SELECT句でNULLが定数として使えないことでした。
普通はあまりやらないのかもしれませんが、UNIONの中やINSERT INTO~SELECTなどを使う場面では特定の列の値を定数にしたいことがあります。
そんなときは、
    SELECT ROW1, 100, 'ABC', NULL FROM TABLE1
などとやったりするわけですが、DB2ではこのようなところでNULLを使うことが出来ずにエラーになってしまうんですね。数値リテラルや文字リテラルは問題なく使えるのに。
試しにMS-AccessとPostgreSQLでもやってみましたが、どちらも問題なくNULLが使えました。
Oracleは試してみる環境がないのですが、たぶん出来るのではないかと思われます。

マニュアルを読んでいると、DB2の定数には全てNOT NULL制約がついていると言うようなことが書かれていました。
この制約に反するので、DB2ではNULLというのは定数ではないということになるようです。
しかし、INSERTやUPDATEではもちろん、CASE式などにもNULLは使えます。
どういうことなのかとさらにマニュアルを読んでみると、これらで使われているNULLというのは定数ではなくてキーワードなんだそうです。
そのため、CASE式でどの条件においてもNULLを返すような式はエラーになるという便利なんだか不便なんだか良く判らない仕様になっていたりします。
たとえば、
    CASE WHEN ROW1=1 THEN NULL ELSE NULL END
などというCASE式はDB2ではエラーになるんですね。
ちなみにPostgreSQLではエラーになりませんでした。


さて、それではNULLを返すにはどうすればいいのか。
結局、NULLIF(0,0)などというちょっとインチキくさい方法で逃げることになりました。
CASE式でも同じ事は出来るのですが、単にNULL値を固定で返したいだけなので記述が短い方を選んだのでした。
でもどちらにしてもスマートなやり方ではないですよね。
こんなときDB2ではどんな方法を採るのが定石なんでしょうか?

なお、使っているのはDB2のV7.2というかなり古いバージョンなので、新しい物では状況は変わっているかもしれません。

« なっとう | トップページ | こんなところを車が通る? »

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/39755/41487232

この記事へのトラックバック一覧です: DB2のNULLは定数ではない?:

« なっとう | トップページ | こんなところを車が通る? »

にほんブログ村

Amazon.co.jp