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


轉自 https://blog.csdn.net/qgfjeahn/article/details/71484042

 

工作中遇到的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”】

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM