1. 程式人生 > >Oracle資料庫中查詢結果集中保留兩位小數的問題

Oracle資料庫中查詢結果集中保留兩位小數的問題

工作中遇到的Oracle資料庫欄位格式化問題,在此記錄 
保留兩位小數主要分為兩種情況: 
1.數字保留兩位小數;(小數點左側數字可能比較大,比如1234567890.12) 
2.百分比保留兩位小數;(小數點左側數字數字小於等於100,比如98.76%)

現針對Oracle資料庫做以下示例:
在開始之前,先介紹一下Oracle函式大全中的轉換函式to_char( )

TO_CHAR(x[[,c2],C3])
【功能】將日期或資料轉換為char資料型別
【引數】
x是一個date或number資料型別。
c2為格式引數
c3為NLS設定引數                      //不常用

c2格式引數中常用的替換符0和9,分別代表如下含義:

0:零,在對應位置返回對應的字元,如果沒有則以’0’填充。
9:在小數位,則表示轉換為對應字元,如果沒有則以0表示;在整數位,沒有對應則不填充字元. 
二者最大的區別是:對應位沒有則填0,而9不填充字元; 
二者共同點:如果格式的位數不如數字的位數多,則返回‘#’
1.數字保留兩位小數:
通過拼接語句來模擬資料庫表中的列,如下: 
select result,
       to_char(result, '9999.99') as "9的位數不足",
       to_char(result, '9999999999.99') as "9的位數充足",
       to_char(result, '0000.00') as "0的位數不足",
       to_char(result, '0000000000.00') as "0的位數充足",
       to_char(result, '9999999990.00') as "0的位數充足",
       trim(to_char(result, '9999999990.00')) as "9的位數充足且去掉左側"
from (
    select 0 result from dual union
    select 1 result from dual union
    select 123 result from dual union
    select 123.4 result from dual union
    select 12345.67 result from dual union
    select 12345678.2 result from dual
)
結果集如下: 
 è¿éåå¾çæè¿°


通過結果集可以看出 
【對應位沒有則填0,而9不填充字元】, 
【9在小數位,則表示轉換為對應字元,如果沒有則以0表示;在整數位,沒有對應則不填充字元.】 
【如果格式的位數不如數字的位數多,則返回‘#’】 
此外還有當結果為0時,預設是省略整數位0,這明顯不是我們想要的,此時可以在格式字串的小數點左側即個位上寫0,後兩列的查詢結果就正常了; 
倒數第二列每個數字的左側都有大量的空白字元(被佔位符9替換來的),此時可以使用trim( )函式將字串左側空白去掉,所以最終的寫法是 
【 trim(to_char(result, ‘99999999999990.00’)) as “9的位數充足且去掉左側” 】

2.百分比保留兩位小數:


通過語句拼接,模擬資料庫表中計算欄位

select result from (
    select 0 result from dual union
    select 1 result from dual union
    select 0.12345 result from dual union
    select 0.2 result from dual union
    select 0.23 result from dual union
    select 0.234 result from dual union
    select 0.2345 result from dual union
    select 0.23454 result from dual union
    select 0.23456 result from dual
)
查詢結果: 

è¿éåå¾çæè¿°
要把結果集result*100然後保留兩位小數,並進行四捨五入,且在後面添加個‘%’,SQL語句如下:

select result,
       to_char(result * 100, '99.99') || '%' as "9位數不足",
       to_char(result * 100, '00.99') || '%' as "0位數不足",
       to_char(result * 100, '99990.99') || '%' as "百分比",
       trim(to_char(result * 100, '99990.99')) || '%' as "去左側空格的百分比",
       to_char(result * 100, 'fm99990.99') || '%' as "使用fm字首的格式百分比",
       to_char(result * 100, 'fm99990.00') || '%' as "使用fm字首的格式百分比2"
from (
    select 0 result from dual union
    select 1 result from dual union
    select 0.12345 result from dual union
    select 0.2 result from dual union
    select 0.23 result from dual union
    select 0.234 result from dual union
    select 0.2345 result from dual union
    select 0.23454 result from dual union
    select 0.23456 result from dual
)
結果集如下: 

è¿éåå¾çæè¿°
從結果集中可以看出:第4,5,7三列都是可以正常查詢出結果的,第4列左側有空白字元,第5列使用trim( )函式去空,第7列使用了fm字首直接起了去空的效果; 
9的特性是小數點右側用0替換,左側沒有則填充空白,但是使用了fm字首後,小數點右側的9佔位符替換成的0就沒有了,而0的特性是對應位置如果沒有資料則替換成0,因此格式字串修改為‘fm990.00’這樣的; 
最終這兩種都可以: 
【trim(to_char(result * 100, ‘99990.99’)) || ‘%’ as “去左側空格的百分比”】 
【to_char(result * 100, ‘fm99990.00’) || ‘%’ as “使用fm字首的格式百分比2”】

---------------------