2011-09-13 10 views
2

私はデシベルで何か他のもののようにnull値を渡すようにしようとしていると、そうOracleのNVLは問題

select NVL(column1, '0') column1 from table1 

ようWhere句を使用せずに動作するようですが作り出すこの

0 test1 
    0 test2 
    1 test3 

しかしとき私はそれがこの

を作り出すので

select NVL(column1, '0') column1 from table1 where column1 <=1 

のようにWHERE句を追加します

1 test3 

しかし、私は、クエリに以下を追加した場合、今では

select NVL(column1, '0') column1 
from table1 
where NVL(column1, '0') <=1 

に動作します。しかし、価値がWhere

と正しく任意のアイデアを表示するために取得するためにラウンド長い道のりのように思えます私は間違っているの?あなたはWHERE句からSELECTリストに定義されたエイリアスを参照することはできません事前

+2

はなぜ ' '0''代わりに' 0 'の言うことだろうか? –

答えて

8

感謝。あなたはSELECTリストにNVL機能を適用するのであれば、あなたは(あなたが実証されてきたように)WHERE句で、同じ関数呼び出しを必要とするだろうか、関数を適用する必要がありますインライン・ビューで

SELECT column1 
    FROM (SELECT nvl(column1, 0) column1 
      FROM table1) 
WHERE column1 <= 1 

一般的には、COLUMN1NUMBERの場合、NVLの2番目のパラメータはNUMBERである必要があります。それ以外の場合は、暗黙的な変換を行い、比較操作は数値比較の意味論ではなく文字列比較のセマンティクスを使用して終了する可能性があります。文字列 '12'は文字列 '2'よりも小さいので、予期しない結果につながる可能性があります。

+0

説明をいただきありがとうございます:) –

3

あなたは正しい方法を示しています。

代替は

OR column IS NULL