问题描述:
范围值是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进行格式化