设为首页 收藏本站
查看: 533|回复: 0

[经验分享] Oracle小数点的实际保留问题的4方案

[复制链接]

尚未签到

发表于 2016-8-3 22:31:55 | 显示全部楼层 |阅读模式
  转自 http://database.iyunv.com/art/201004/196769.htm
  
  








我们今天主要和大家分享的是Oracle小数点的实际保留问题,其具体的方法有4个,其中包括to_char的fm格式的使用,以下就是相关内容的介绍。
AD:






 
以下的文章主要是讲述Oracle小数点的实际保留问题,如果你有相关的业务清单有提取要求的话,我们需要使用到百分率,通常的情况下,需要对其保留两位小数,其实我们只用round就可以实现(round(_data,2) ),但是格式不是很工整。
对格式要求不严谨的情况下使用round即可,以下是网络搜索到的处理方法:
方法一:使用to_char的fm格式,即:
 


  • to_char(round(data.amount,2),'FM9999999999999999.00') as amount 

不足之处是,如果数值是0的话,会显示为.00而不是0.00。
另一需要注意的是,格式中Oracle小数点左边9的个数要够多,否则查询的数字会显示为n个符号“#”。
解决方式如下:
直接这样就好:to_char(round(data.amount,2),'FM9999999999999990.00') as amount 


  • select decode(salary,0,'0.00',(to_char(round(salary,2),'fm99999999999999.00'))) from can_do; 

方法二:使用case when then else end进行各种情况的判断处理:
 


  • case  

  • when instr(to_char(data.amount), '.') < 1 then  
  • data.amount || '.00'  

  • when instr(to_char(data.amount), '.') + 1 = length(data.amount) then  
  • data.amount || '0'  
  • else  
  • to_char(round(data.amount, 2))  
  • end as amount_format  

 
方法三:可以使用Oracle自带的参数设置,即
 


  • column amount format l9999999999.99 

此方法的不足是,format中的Oracle小数点左面的9的个数要已知,否则会出现超过的数字显示为########的情况。
另外一个问题是,使用column时,设置生效是session级还是system级,需要注意。
也许某张表的数值列不总是要求所有的地方显示时,都是Oracle小数点后两位的格式,
此时只能使用session级,但是有个数据库连接会话超时的问题,如果不是使用到system级,不建议使用该方法。
方法四:使用to_char+trim的方式,如下:
 


  • select trim(to_char(1234,'99999999999999.99')) from dual; 

或者
 


  • select ltrim(trim(to_char(1234.525,'00000000000000.00')),'0') from dual; 

此处使用了14个9或者14个0的格式,建议使用14个9的方式,方便些。方法四的不足之处是
如果数值是0的话,转化之后为.00而不是0.00,补救措施是,decode一下。
另一需要注意的是,格式中Oracle小数点左边9或者0的个数要够多,负责查询的数字会显示为n个符号“#”。
如下:
 


  • select decode
    (salary,0,'0.00',trim(to_char(salary,'99999999999999.99'))) from can_do; 


或者
 


  • select decode
    (salary,0,'0.00',ltrim(trim(to_char(salary,'00000000000000.00')),'0')) from can_do; 


结论:建议使用方法四中的trim+to_char的方式或者方法一的补救之后的方式,而且最好使用Oracle小数点左边n个9的方式,不要使用0的方式,否则,要多一步trim处理。
即:


  • select decode(salary,0,'0.00',
    trim(to_char(salary,'99999999999999.99'))) from can_do; 


或者
 


  • select decode(salary,0,'0.00',
    (to_char(round(salary,2),'fm99999999999999.00'))) from can_do;  


以上的相关内容就是对Oracle小数点的保留问题的介绍,望你能有所收获。




  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-252459-1-1.html 上篇帖子: Oracle 数据库优化的R方法(Method R) 下篇帖子: 关于Oracle Exp-00003问题的解决方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表