Oracle - 为什么数字的前导零消失

时间:2017-08-25 07:18:16

标签: oracle

我有0.8和0.80等数据。在我的选择查询中,我得到错误的数据。 例如
从双重中选择0.80; 从双重中选择0.8;

两者都给出0.8,但我的期望是当值为0.80时显示o.80。 我发现所有情况0.90,0.70 ..... 如何实现这个

3 个答案:

答案 0 :(得分:1)

如果数据类型为NUMBER(例如,它在select 0.8 from dual中),则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无法以不同方式显示它们。如果您想要VARCHAR2字符串而不是NUMBER,请使用select '0.8' from dual

答案 1 :(得分:0)

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

答案 2 :(得分:0)

0.80.800.80000都是相同的数字,但格式不同。

Oracle的数字内部表示并不存储您在输入时对其进行格式化的方式,因此0.80.800.8000都将保存在数据库内存中作为数字0.8

您正在返回一个数字而不是格式化字符串,因此Oracle将返回0.8并让用户界面(例如SQL / Plus)显示它认为合适的内容。

如果您想要具有特定格式的数字(即总是带有两个小数位),那么您需要将数字转换为该数字的格式化字符串表示形式:

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

如果您希望数字格式与输入完全一致(带有前导和/或尾随零),那么您需要将这些数字存储为字符串以保持格式:

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