4

このクエリ:

select nvl(0.75,0) from dual

私に(数値)を与えます0.75が、このクエリ:

select decode(1,0,null,0.75) from dual 

'.75'(文字列)をくれます。

なんで?

2番目のクエリを次のように変更して、これを修正しようとしました:

select decode(1,0,null,to_char(0.75,'0.99')) from dual

しかし、私の実際のコードでは、0.75 はフィールド (NUMBER) になり、小数点以下の桁数が異なる可能性があり、その値から何かを追加/削除することは想定していません。

ゼロの欠落の問題を修正する方法についてのアイデアはありますか?

4

4 に答える 4

6

これは、decode ステートメントの 3番目のパラメーターが NULL であるためです。ドキュメント1のとおりです(私の強調)。

Oracleは、比較する前に、 expr と各検索値を最初の検索値のデータ型に自動的に変換します。最初の結果のデータ型が CHAR の場合、または最初の結果が null の場合、Oracle は戻り値をデータ型に変換します。 VARCHAR2 .

あなたの場合、最初の結果は NULL であり、Oracle はこれを VARCHAR2 として扱います。戻り値は暗黙的に VARCHAR2 に変換されています。次のように変更するDECODE()と、数値が得られます。

select decode(1, 0, 0, 0.75)

NULLIF()関数を使用して NULL を実現できます。

select nullif(decode(1, 0, 0, 0.75), 0) ...

返されるすべてのデータ型が同じであることを強制する CASE ステートメントを使用することをお勧めします。

select case 1 when 0 then null
              else 0.75
       end ...

1. 私も引っかかったことがあります。

于 2013-09-11T20:04:43.107 に答える