2017-08-25 2 views
-3

私は0.8と0.80のようなデータを持っています。私の選択クエリでは、私は間違ったデータを持っています。 例
デュアルから0.80を選択してください。 デュアルから0.8を選択します。Oracle - 数字の先行ゼロが消えるのはなぜですか?

はどちらも0.8を示していますが、値が0.80のときはo.80が表示されます。私はこの

+0

これはクライアントの動作です。どのクライアントアプリケーションを使用していますか? –

+0

BTWは、「末尾」ゼロです。 「先頭の」ゼロは文字列の左側にあります。 –

+0

「0.8」と「0.80」の間には数学的な違いはありません。 Oracleはそれらを同じに保存し、後続のゼロを表示するようにクライアントが構成されている場合は、同じ数の末尾のゼロを使用して、すべてのクライアントが同じものを表示します。それらが異なるというフィクションを維持したい場合は、カラムをストリングとして保存して表示する必要があります。しかし、それは狂気だろう。 – APC

答えて

0
select Ltrim(To_char(0.80, 'B999999999999999999990.99'), ' ') as bn from dual 
+0

両方とも0.80を表示しますが、選択Ltrimの場合(To_char(0.8、 'B9999999999999999999999.99.99')、 '')は二重からbnになります。それは0.8だけrtを表示します。 –

0

0.80.800.80000を達成するためにどのよう .....すべてのケース0.90,0.70見つかり は全て同じ数であるが、それらは異なるフォーマットされています。数字の

Oracleの内部表現は、あなたが入力してそう0.80.800.8000はすべて数0.8としてデータベースのメモリに保持されたときにあなたがそれらをフォーマットしているか格納されません。

フォーマットされた文字列ではなく数字が返されます.Oracleは0.8を返し、ユーザインタフェース(SQL/Plusなど)で表示するようにします。

あなたは、特定のフォーマットの数(つまり、常に2つの小数点以下を含む)、あなたはその数のそのフォーマットされた文字列表現に数値を変換する必要がありますしたい場合:あなたは数字をしたい場合

SELECT TO_CHAR(your_number, 'FM99999999990D00') FROM DUAL; 

をそして、あなたがその書式設定を維持するために、文字列として、これらの数値を格納する必要があります(先頭および/またはゼロを末尾に)入力されたとおりに正確にフォーマット:

SELECT '0.8' FROM DUAL; 
SELECT '0.80' FROM DUAL; 
SELECT '00.8' FROM DUAL; 
1

データは、それがexamplためselect 0.8 from dualにあるタイプNUMBER(である場合e)は、その後、0.8と0.80は区別できない - 彼らは両方を示しdump機能として内部的に同じ方法で格納されます

with data (n) as 
(select 0.8 from dual 
    union all 
    select 0.80 from dual 
    union all 
    select 0.800000 from dual 
) 
select n, dump(n) from data; 

0.8 Typ=2 Len=2: 192,81 
0.8 Typ=2 Len=2: 192,81 
0.8 Typ=2 Len=2: 192,81 

だからOracleが異なっそれらを表示する方法はありません。 NUMBERではなくVARCHAR2文字列を使用する場合は、select '0.8' from dualを使用します。

関連する問題