`
piperzero
  • 浏览: 3471733 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

在处理数据时发现一个问题,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直接出来,感觉也没什么必要,暂时就这些吧。






-The End-

分享到:
评论

相关推荐

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。  拉里•埃里森  就业前景 从就业与择业的...

    PL/SQL 基础.doc

    6) PL/SQL: 存储在数据库内运行, 其他方法为在数据库外对数据库访问,只适合ORACLE; 2. PL/SQL 1) PL/SQL(Procedual language/SQL)是在标准SQL的基础上增加了过程化处理的语言; 2) Oracle客户端工具访问Oracle...

    PLSQLDeveloper下载

    范围为1e130~10e125,其使用语法为: number[(precision, scale)] 其中(precision, scale)是可选的,precision表示所有数字的个数,scale表示小数点右边数字的个数。 varchar2 用来存储变长的字符串,其使用语法为...

    PL/SQL Developer8.04官网程序_keygen_汉化

    范围为1e130~10e125,其使用语法为: number[(precision, scale)] 其中(precision, scale)是可选的,precision表示所有数字的个数,scale表示小数点右边数字的个数。  varchar2 用来存储变长的字符串,其使用语法...

    RestAPI-JAVA-MySQL:这是针对代码挑战的三个差异问题的解决方案。 这包括诸如Web APP中Java MySQL中的Rest API之类的技术。 这些项目是在Eclipse IDE中开发的

    预期结果:45 + 20 + 5 + 11 + 43.2 = 124.2 ****问题2 **** 说明:增强以前的程序,以便它还可以在SQL数据库(如HyperSQL,ORACLE,MySQL等)中使用纯JDBC将表保存在表的新记录中:-文件路径-添加结果-程序执行时...

    2009达内SQL学习笔记

    保存在oracle数据库中的所有操作细节: spool oracleday01.txt :开始记录 spool off :开始保存细节 四、SELECT语句:选择操作、投影操作。 select:从一个或多个表中检索一个或多个数据列。包含信息:想选择...

    java基础题 很全面

    9. 如何去小数点前两位,并四舍五入。 35 10. 如何取得年月日,小时分秒 35 11. 如何取得从1970年到现在的毫秒数 35 12. 如何列出某个目录下的所有子目录 35 13. 根据代码,选出正确的选项 36 14. JAVA代码查错 36 15...

    整理后java开发全套达内学习笔记(含练习)

    System.out.printf() 可插入带 % 的输入类型,前两种只可以插入转义符, 不能插入 % 的数据或字符串 在 printf 里面,输出有5个部分 %[argument_index$][flags][width][.precision]conversion 以“%”开头,[第几个...

    JAVA面试题最全集

    如何取小数点前两位,并四舍五入。 4.日期和时间 如何取得年月日,小时分秒 如何取得从1970年到现在的毫秒数 如何获取某个日期是当月的最后一天 如何格式化日期 5.数组和集合 6.文件和目录(I/O)操作 如何...

    C#编程经验技巧宝典

    98 <br>0153 如何自定义数字小数点左边分组位数 98 <br>0154 格式化输入数据为货币格式 99 <br>0155 如何计算两个整数的乘积 99 <br>0156 如何将二进制数转换为十进制数 100 <br>0157 如何...

Global site tag (gtag.js) - Google Analytics