关于Oracle查询小于1的小数,出现小数点前0丢失的问题

问题描述:

范围值是0.9-1.4,本来查到的数需要和范围值进行匹配,如果小于最低值,显示向下箭头,如果高于最高值,显示向上箭头,结果并没有进行范围值匹配,

查看前端传入后端的数据,发现最低范围值是.9,于是又返回去查看数据来源,看到sql语句是

nvl(to_char(b.down),a.down) as down,nvl(b.print,a.reference)

执行以后发现查到的数据是.9

查了一下原因,原来to_char(number,'格式')这个函数是将数据转为字符串,如果没有设置格式就会自动省去小数点前面的0

 

更新一下根本原因:

其实如果不用to_char,直接查是可以显示0.9的,但是原本的sql语句用了nvl()函数(如果a为空,就取b值),不用to_char的话,nvl(a,b),b为字符串的时候会报错!

就很奇怪为什么会报错,做了各种控制变量对比后,发现原来是b表的字段是number类型,a表的字段是varchar类型,当a的值为一个非数字的数据时,nvl(b,a)是无法匹配一个number和varchar的,如果a的值是一个数字的字符,nvl()还能将a转换为数字和b匹配,所以根本原因是a和b的数据需要保持相同类型,就算不同也要能转换为相同类型。

所以其实解决方法应该有两个:

1.要么把b的数据永久转成varchar类型,用to_char()函数

2.要么把a的数据永久转成number类型,用to_number()函数,不过这个不太可能,因为a表的数据不知道是怎么维护的,居然还有中文字符,所以用to_number肯定会报错

 

最最后:哪个傻逼设计的表结构,绝了!

解决方法:

使用to_char需要设置数字的格式

nvl(to_char(b.down,'fm9990.99'),to_char(a.down,'fm99990.99')) as down,nvl(b.print,a.reference)

fm去掉字符串前面的空格

9990.99表示4位数字,千位百位十位无数字时不显示[标识9],个位数[标识0]永久显示,小数没有不显示[标识9]

如果需要永久显示两位小数,则用9990.00进行格式化

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值