2011-06-27 17 views
6

2つの値が次の値以外のNULLになる可能性がある場合、等しいかどうか比較する方法がありますか?Oracle SQLのNULLの比較

a = b or (a is null and b is null) 
+4

[SQLではnullを取得する](http://stackoverflow.com/questions/191640/get-null-null-in-sql)の可能な複製。一般に、これを書く方法は簡単ですが、関数参照がないため、最も効率的な方法です。 – DCookie

+0

もしそれが本当であれば私は興味があります。なぜなら 'is null'は括弧を持たないからです。関数が呼び出されていないわけではありません。結局のところ、比較はまだ実行されています。私は頻繁に使用されるので、dbが '合体 'のために最適化されていると確信しています。私はあなたが間違っていると言っているわけではない、ちょうど新しいDBエンジンでそれをベンチマークするのは面白いだろう。 – vol7ron

+0

これを11gのインスタンスでテストしました。劇的ではないが、合体は約10%のCPUを使用する。 – DCookie

答えて

0

あなたはNVLでそれをラップし、あなたのセットには期待できないいくつかの値に設定することができます

NVL(a,0) = NVL(b,0) 
+5

Aが0でBがnullの場合、結果が異なります。 –

+1

私はhaitekは、セットで期待されていなかった値が「0」であることを暗示していると思います。私はこれが、コードでSQLコメントを保持することが重要な場合の良い例だと思います。プログラマ/メンテナーがフィールドの可能な値を認識することは重要ですが、有効です。これはおそらく私がそれを恥ずかしく思っている理由です。 – vol7ron

5

次のことができます。

a=b or coalesce(a,b) is null 

ます。またnvlを使用することができ、それ従来の関数で、​​3210は最初の非ゼロで停止するため、より高速です

+2

この答えは誤解を招きます: 'nvl'と' coalesce'は、ほとんどの用途(2つのカラムまたはカラムと静的な値を渡した)で同等に機能します。 2番目のパラメータが関数か複雑な評価(そして最初のパラメータがヌル)で、 'coalesce'がうまく機能するときだけです。 – Allan

+0

私は 'nvl'は2つの引数しか受け入れないと思いますが、' coalesce'はリストを受け入れるので、正しいと思います。もう一つ注目すべきは、 'nvl'は厳密なデータ型を必要とせず、' coalesce'はすべてのデータ型を同じにする必要があるということです。パフォーマンスの影響があります。 – vol7ron

4

使用可能DECODE(A,B,1) = 1

DECODEはNULLの処理に不規則です。

しかし私は意図が不明で、vol7ronの答えを好むと思います。入力を最小限にすることよりも明瞭です!

+0

非常に興味深い 'decode'の使用。 +1 – vol7ron