在處理數(shù)據(jù)時(shí)發(fā)現(xiàn)一個(gè)問題,Oracle對(duì)于小于1的小數(shù),小數(shù)點(diǎn)前面的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工具查看時(shí)是有前面的0的
通過column num format 000000000000.99999999999設(shè)置也可以顯示前面的0
但是這些都只是顯示的結(jié)果,而不是數(shù)據(jù)庫(kù)保存結(jié)果
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
可以看到,無論前面出現(xiàn)多少位,通過substr函數(shù)獲取的第一位任然是'.'
無論怎么轉(zhuǎn)換,只要最終輸出結(jié)果是數(shù)值型的,小數(shù)點(diǎn)前的0必然被丟棄,所以只有將數(shù)值轉(zhuǎn)換為字符型,大致有兩種方法:
1、直接使用to_char函數(shù)
首先實(shí)驗(yàn)一下將小數(shù)點(diǎn)前和小數(shù)點(diǎn)后都加上99999999的格式:
SQL> select to_char(num,'999999999.999999999') from t1_number;
TO_CHAR(NUM,'9999999
.326800000
.579656860
52345234.568600000
4.552686000
5.292000000
發(fā)現(xiàn)小數(shù)點(diǎn)前還是沒有0,而小數(shù)點(diǎn)后的0多出來了
再實(shí)驗(yàn)一下小數(shù)點(diǎn)前和小數(shù)點(diǎn)后都加上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
發(fā)現(xiàn)小數(shù)點(diǎn)前是有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表示的格式中產(chǎn)生的0:
SQL> select to_char(num,'fm999999999.999999999') from t1_number;
TO_CHAR(NUM,'FM99999
.3268
.57965686
52345234.5686
4.552686
5.292
但是這樣還是沒有0,最后發(fā)現(xiàn)可以將小數(shù)點(diǎn)前的第一位置為0即可(注意9的個(gè)數(shù)要大于數(shù)值的位數(shù)):
SQL> select to_char(num,'fm999999990.999999999') from t1_number;
TO_CHAR(NUM,'FM999990.、
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函數(shù)
既然小于1的小數(shù)首位必然是'.',那就判斷首位是否為'.',是則在前面加上'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
也可以寫個(gè)函數(shù)來判斷一下,不過可以用decode直接出來,感覺也沒什么必要,暫時(shí)就這些吧。