最近业务有个需求变更,将一个字段的元变更为万,但是为了不变更历史数据,需要在维护和查询的时候进行变更。
该字段在数据库中字段为Number(9),在实体类中为String。
过程中犯了几错问题,进行记录
1、第一次sql的时候直接进行了转换,未考虑到转String问题
SELECT round(12100/10000,2) from dual;
这个时候数据库中的结果为:
但是页面端的显示为:”.21”
是因为number->String时出现了问题,于是对sql进行了变更
2、第二次sql
select to_char(round(1000/10000,2),’fm99990.00’) from dual;
这个格式化含义说明:
“fm”:删除因为9带来的空格
“9”:如果匹配到数字,原样展示,未匹配到,作为空格
“0”:如果匹配到数字,原样展示,未匹配到,展示0
小数点前的展示要为0,这样.21的情况不会存在,可以保证小数点前有数据。
3、这样的展示,测试经过测试以后,表示这是有问题的,本身进入数据100(万),但是展示结果变成了100.00(万),这样视觉效果并不好,应当是页面端输入多少,你展示多少,不能统一而论的处理。
于是,进行了第三次变动:
select decode(
substr(
TO_CHAR(ROUND(10000/10000,2),’fm99990.99’),
instr(TO_CHAR(ROUND(10000/10000,2),’fm99990.99’),’.’)
),
‘.’,
substr(
TO_CHAR(ROUND(10000/10000,2),’fm99990.99’),
1,
instr(TO_CHAR(ROUND(10000/10000,2),’fm99990.99’),’.’)-1
),
TO_CHAR(ROUND(10000/10000,2),’fm99990.99’)
) from dual;
这个sql比较之前的一下长了不少,但是含义其实很简单,
而上面集数的含义即为:
decode(
从小数点向后截取,
如果仅为小数点,
取从头到小数点前的一位,
其它的取原值
)
调整一下格式化,将后缀的.00->.99
这样数据就会出现 x. 这样的数据,例如10000/10000,结果就是:1.
调整目的是为了将.00换成->x.这样的数据清除掉,不调整的话也是可以的,将decode中的条件’.’进行对应变更即可。
上面的sql过于繁杂,所以进行了sql调整,调整如下:
SELECT
regexp_replace(
TO_CHAR(ROUND(10000/10000,2),’fm99990.99’),
‘\d+.$’,
TO_CHAR(ROUND(10000/10000,2),’fm99990’)
)
FROM
dual;
regexp_replace函数的作用就不再描述,修正sql的描述含义如下:
regexp_replace(元转成万后的值,匹配正则的值,匹配到以后替换的值)
其中\d+.$的含义为:数字打头,以.结尾,
因为格式化用的是.99,所以只会出现x.的形式需要处理,按照整数处理即可,其它情况我们原样输出即可。