记录oracle中查询数据0.xx结果为.xx的解决办法

311 阅读1分钟

由于业务需要,把本来的varchar2转换成了number(22,2),其中有一个字段存储的是0.xx类型的数据。问题来了,今天再次查询发现数据库中存储的是0.01,但是查询结果是.01,开始以为是代码问题,排查后发现问题在于bean中是string,在查询映射转换中把前面的0省略掉了(度娘说是存储时为了节省空间,可是表里会什么没有省略0呢?查询做char转换才省略?)
网上搜到了几种解决办法:
1)select to_char(rate) from mytest;

select regexp_replace(rate,'^.','0.')as rate from mytest;

这里采用了oracle里的正则表达式函数regexp_replace,详情参考https://www.cnblogs.com/SummerinShire/p/6182773.html
2)select case when rate like '.%' then '0'||rate else to_char(rate) end from mytest;

3)select decode(substr(rate,1,1),'.','0'||rate,rate) from mytest;

通过substr函数将第一位截取出来,如果和点.匹配,则前面拼接0,否则就等于它 自己。decode(a,b,c,d),解释:如果a和b相等,就输出c,否则输出d。decode函数还有其他的用法,自行研究。
4) select to_char(rate,'fm9999990.9999') from mytest;

直接利用to_char函数进行格式化,格式化规则自行研究。

猜想:前面说的为什么数据库中显示的是0.22,我觉得实际存储应该 还是0.22,只是在查询中做了隐是式转换,代码底层把number类转换成了string.通过substring函数截取第一位是点不是0,可能是在subtrings时就已经先to_char把number转了类型。。