小数点前的0的显示问题
						
				
		
		
				
				 
		
				
						
						
				 
		
				
						    在处理数据时发现一个问题,Oracle对于小于1的小数,小数点前面的0是不显示的。这个问题遇到的很普遍,解决的方法也挺多的。大致上研究了一下这个问题,提供了用to_char和decode函数来解决这个问题的两种方法。先来看一下这个问题:
				
		
		
				
						
						
				 
		
				
						
						
				 
		
				
						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直接出来,感觉也没什么必要,暂时就这些吧。