在处理数据时发现一个问题,Oracle对于小于1的小数,小数点前面的0是不显示的。 SQL> create table t1_number (num number); Table created SQL> insert into t1_number values(0.3268); 1 row inserted SQL> insert into t1_number values(0.57965686); 1 row inserted SQL> insert into t1_number values(52345234.5686); 1 row inserted SQL> insert into t1_number values(4.552686); 1 row inserted SQL> commit; Commit complete 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 5 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 也可以写个函数来判断一下,不过可以用decode直接出来,感觉也没什么必要,暂时就这些吧。