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
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
总结:有些时候我们既想保留小数也想保留十位数上的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;
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
总结:有些时候我们既想保留小数也想保留十位数上的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;
相关文章推荐
- oracle保存小数点前为"0"的问题
- oracle保存小数点前为"0"的问题
- oracle保存小数点前为"0"的问题
- oracle保存小数点前为"0"的问题
- oracle保存小数点前为"0"的问题
- "error: failed to attach to process ID 0"问题解决
- Oracle EBS 报表输出字符字段前部"0"被Excel自动去掉问题
- oracle 临时表 解决 "表 *** 发生了变化,触发器/函数不能读"的问题
- oracle的文件编辑器问题: SP2-0110: 无法创建保存文件 "afiedt.buf"
- C++字符串中的"\0"问题
- "ORA-01779: 无法修改与非键值保存表对应的列"问题
- C++字符串中的"\0"问题
- "error: failed to attach to process ID 0"问题解决
- "select一直返回0"的问题解决和总结
- Oracle EBS 报表输出字符字段前部"0"被Excel自动去掉问题
- 关于"GridView1.Columns.Count总为0"的问题
- "你没有权限在此位置保存文件 请与管理员联系的问题解决"
- 解决[ASP.NET]"编译器错误信息: CS1595: 已在多处定义"的问题
- Oracle小数点保留问题
- "Spark Streaming + Kafka direct + checkpoints + 代码改变" 引发的问题