您的位置:首页 > 数据库 > Oracle

oracle保存小数点前为"0"的问题

2013-08-08 11:12 519 查看
SQL> column num format 99999999999.9999999999999

SQL> select * from t1_number;

 

                       NUM

--------------------------

            .3268000000000

            .5796568600000

    52345234.5686000000000

           4.5526860000000

    使用PL/SQL DEV工具查看时是有前面的0的

    通过column num format 000000000000.99999999999设置也可以显示前面的0

 

    但是这些都只是显示的结果,而不是数据库保存结果

SQL> column num format 00000000000.9999999999999
SQL> select * from t1_number;

 

                       NUM

--------------------------

 00000000000.3268000000000

 00000000000.5796568600000

 00052345234.5686000000000

 00000000004.5526860000000

 00000000005.2920000000000

 

SQL> select substr(num,1,1) from t1_number;

 

SU

--

.

.

5

4

5

 

    可以看到,无论前面出现多少位,通过substr函数获取的第一位任然是'.'

    无论怎么转换,只要最终输出结果是数值型的,小数点前的0必然被丢弃,所以只有将数值转换为字符型,大致有两种方法:

1、直接使用to_char函数

 

    首先实验一下将小数点前和小数点后都加上99999999的格式:

 

SQL> select to_char(num,'999999999.999999999') from t1_number;

 

TO_CHAR(NUM,'9999999

--------------------

          .326800000

          .579656860

  52345234.568600000

         4.552686000

         5.292000000

 

    发现小数点前还是没有0,而小数点后的0多出来了

    再实验一下小数点前和小数点后都加上0000000000格式:

 

SQL> select to_char(num,'00000000000.000000000')
from t1_number;

 

TO_CHAR(NUM,'000000000

----------------------

 00000000000.326800000

 00000000000.579656860

 00052345234.568600000

 00000000004.552686000

 00000000005.292000000

 

    发现小数点前是有0了,但是两边的0都多出来了,使用FM来去掉多于的0:

 

SQL> select
to_char(num,'fm00000000000.000000000') from t1_number;

 

TO_CHAR(NUM,'FM0000000

----------------------

00000000000.326800000

00000000000.579656860

00052345234.568600000

00000000004.552686000

00000000005.292000000

 

    没有效果,说明FM只能去掉用9表示的格式中产生的0:

 

SQL> select
to_char(num,'fm999999999.999999999') from t1_number;

 

TO_CHAR(NUM,'FM99999

--------------------

.3268

.57965686

52345234.5686

4.552686

5.292

 

    但是这样还是没有0,最后发现可以将小数点前的第一位置为0即可(注意9的个数要大于数值的位数):

 

SQL> select
to_char(num,'fm999999990.999999999') from t1_number;

 

TO_CHAR(NUM,'FM99999

--------------------

0.3268

0.57965686

52345234.5686

4.552686

5.292

 

    检查一下第一位,没有问题:

 

SQL> select
substr(to_char(num,'fm999999990.999999999'),1,1) from t1_number;

 

SU

--

0

0

5

4



 

2、使用decode函数

 

    既然小于1的小数首位必然是'.',那就判断首位是否为'.',是则在前面加上'0'即可

 

SQL> select
decode(substr(num,1,1),'.','0'||num,num) from t1_number

DECODE(SUBSTR(NUM,1,1),'.','0'||NUM,NUM)

-----------------------------------------

0.3268

0.57965686

52345234.5686

4.552686

5.292

    同样检查一下第一位,没有问题

SQL> select
substr(decode(substr(num,1,1),'.','0'||num,num),1,1) fro

m t1_number;

 

SU

--

0

0

5

4

5

总结:有些时候我们既想保留小数也想保留十位数上的0;

POSINFO_REPORT_UPLOADRATE                POSINFO_UPLOADRATE

---------------------------------------- ----------------------------------------

.5                                       0

88.5                                   55.2

SELECT to_char(888.453,'fm99990.09') FROM dual;

SELECT to_char(0,'fm99990.09') FROM dual;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: