欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Oracle数据库中查询结果集中保留两位小数的问题

程序员文章站 2022-07-15 09:59:54
...

工作中遇到的Oracle数据库字段格式化问题,在此记录
保留两位小数主要分为两种情况:
1.数字保留两位小数;(小数点左侧数字可能比较大,比如1234567890.12)
2.百分比保留两位小数;(小数点左侧数字数字小于等于100,比如98.76%)

现针对Oracle数据库做以下示例:

在开始之前,先介绍一下Oracle函数大全中的转换函数to_char( )

TO_CHAR(x[[,c2],C3])
【功能】将日期或数据转换为char数据类型
【参数】
x是一个datenumber数据类型。
c2为格式参数
c3为NLS设置参数                      //不常用

c2格式参数中常用的替换符0和9,分别代表如下含义:

  • 0:零,在对应位置返回对应的字符,如果没有则以’0’填充。
  • 9:在小数位,则表示转换为对应字符,如果没有则以0表示;在整数位,没有对应则不填充字符.
    二者最大的区别是:对应位没有则填0,而9不填充字符;
    二者共同点:如果格式的位数不如数字的位数多,则返回‘#’

1.数字保留两位小数:

通过拼接语句来模拟数据库表中的列,如下:
Oracle数据库中查询结果集中保留两位小数的问题

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
)

结果集如下:
Oracle数据库中查询结果集中保留两位小数的问题
通过结果集可以看出
【对应位没有则填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
)

查询结果:
Oracle数据库中查询结果集中保留两位小数的问题

要把结果集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
)

结果集如下:
Oracle数据库中查询结果集中保留两位小数的问题

从结果集中可以看出:第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”】