2011-11-09 9 views
2

このようにNULLを使用して変数を比較することは不可能である。SQLでCASE WHEN NULLを特別に処理しないのはなぜですか? SQLで

CASE x WHEN NULL THEN y ELSE z END 

ため三値SQLロジックと、x = NULL意志決してリターン真。一つは、代わりにこれを行う必要があります。xは、例えば、データを変更する手順の結果であるとき

CASE WHEN x IS NULL THEN y ELSE z END 

は、これは問題がある:

ので
CASE WHEN func(i) IS NULL THEN y 
    WHEN func(i) = 'a' THEN z 
    ELSE      t 
END 

... func(i)は二度評価されるのでしょうか? CASE ... WHEN NULLIS NULL演算子を使用して評価式をNULLと比較する標準的な要件はありません。

このような構成を可能にするDBMSがありますか?

+0

func(i)の結果を保持するための一時変数を導入してcase文で使用できませんか? –

+0

'WHEN'の後の値が単にリテラルであることは保証されていないので、より一貫性を持たせたり、NULLをNULLにするようにSQLを書き直すことなく特別なケースを作ることは簡単な方法ではありません。例えば。式が 'CASE func(i)WHEN Col1 THEN ...'で、 'Col1'がいくつかの行ではnullであるが、他の行ではない場合。 –

答えて

2

WHENの後の値が単なるリテラルであることは保証されていないので、より一貫性を持たせたり、NULLをNULLにするようにSQLを書き直すことなく、特殊なケースを簡単に行うことはできません。

など。式が​​であり、Col1が一部の行ではnullであるが、他の行ではNULLでない場合...

3

これはNULLが悪い多くの理由の1つに過ぎません。 1つのワークアラウンドは、NULLの代理としてマジック値を選択することです:

CASE COALESCE(func(i), 'nada') WHEN 'nada' THEN y WHEN 'a' THEN z ELSE t END 
+0

私はむしろこれにGUIDを使用したいと思いますが、これは良い考えです。 – Benoit

+0

@Benoit:はい、GUIDは良い選択です。 –

1

は、私はあなたがcase文でこの問題を回避することを可能にするRDBMSを認識していませんよ。あなたがデコード機能を入れ替えることができオラクルで

:!

decode(func(i), null, 'y', 'a', 'z') 

ヌルなくなり= NULLは、通常のSQLで、あなたのロジック内でDECODE文を使用した場合、それが等しいと見なされます。

+0

ありがとう、 'DECODE'はそれを正しく処理する関数です。残念なことにTomも[それを使用しないようにアドバイスしています](http://asktom.oracle.com/pls/apex/f?p=100:11:0%3a%3a%3a%3aP11_QUESTION_ID:1243867216406) – Benoit

+0

11gr2ではまだ削除されていませんが、私はまだ12で削除されないと思われます。個人的には、デコードの使用を避けますが、移植性の理由からです。 – Andrew

関連する問題