oracle儲存小數點前為 0 的問題

2021-06-05 05:16:05 字數 3567 閱讀 1870

在處理資料時發現乙個問題,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直接出來,感覺也沒什麼必要,暫時就這些吧。

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 sq...

oracle 保留小數點前面的0的方法

遇到這麼個情況,flow欄位為0.556,當我試圖將其跟字串連線成新的字串的時候,就會出現0.開頭沒了的情況,如圖 解決方法問到兩種,方法1 將flow先to char,過程中指定格式 select to char flow fm999990.9999 string from nwom.lte sh...

oracle查詢不顯示小數點前的0

1.問題起源 oracle 資料庫字段值為小於1的小數時,使用char型別處理,會丟失小數點前面的0 例如0.35就變成了.35 2.解決辦法 用to char函式格式化數字顯示 select to char 0.338,fm9999999990.00 from dual 結果 0.34 這裡重點要...