记一次Oracle返回指定保留小数的数字问题
1 问题背景
在 Oracle 中,根据数据库中配置的保留小数位数,给数据保留对应的位数
2 Oracle to_char 函数格式化数字用法介绍
参数说明
参数 | 说明 | 示例 |
---|---|---|
9 | 存在数字显示数字,不存在显示空格 | 999 |
0 | 存在数字显示数字,不存在显示 0 | 000 |
. | 指定位置返回小数点 | 99.99 |
, | 指定位置返回逗号 | 999,999,999 |
FM | 如果是因为 9 带来的空格则删除 | FM999,999,99.00 |
$ | 数字开头返回一个美元符号 | FM$999,999,99.00 |
实例展示
select to_char(a),
to_char(a,'99.90'),
to_char(a,'90.90'),
to_char(a,'FM90.99'),
rtrim(to_char(a,'FM90.99'),to_char(0,'.'))
from(
select 50 a from dual
union all select 50.57 from dual
union all select 5.57 from dual
union all select 0.35 from dual
union all select 0.4 from dual
)
SQL 结果
从上图我们可以看出 to_char 格式化数字的时候有个坑,如果小数点前面只有 0,格式化之后 0 会丢失。
怎么解决呢,只需要在小数点前面用 0 这个占位符就可以了。
例如:格式化一个百分比,小数点后面保留 2 位,没有补 0
to_char(a,'FM990.00')
因为百分数的整数部分最多 3 位,所以要有三个占位符,防止小数点前面的 0 丢失,所以小数点前面写 0,因为小数点后面没有数字需要补 0,所以不能填 99,只能填 00。
3 oracle 的 lpad()函数
lpad 函数是 Oracle 数据库函数,lpad 函数从左边对字符串使用指定的字符进行填充。从其字面意思也可以理解,l 是 left 的简写,pad 是填充的意思,所以 lpad 就是从左边填充的意思。
语法格式如下:
lpad( string, padded_length, [ pad_string ] )
string:准备被填充的字符串
padded_length:填充之后的字符串长度,也就是该函数返回的字符串长度,如果这个数量比原字符串的长度要短,lpad 函数将会把字符串截取成从左到右的 n 个字符
pad_string:填充字符串,是个可选参数,这个字符串是要粘贴到 string 的左边,如果这个参数未写,lpad 函数将会在 string 的左边粘贴空格
实例展示
SQL> select lpad('abcde',10,'oq') from dual;
LPAD('ABCDE',10,'OQ')
---------------------
oqoqoabcde
SQL> select lpad('abcde',2) from dual;
LPAD('ABCDE',2)
---------------
ab
4 解决方案
select to_char(numa,'FM990.'|| lpad('0',保留位数,0)) from dual
通过to_char和lpad函数来转换数字,还可加上round进行四舍五入等操作
文章转载自:
https://www.cnblogs.com/520future/p/7463309.html https://blog.csdn.net/weiyanqiang2012/article/details/96970129