今天优化代码,发现了一个数据库xml的sql有个case when 可以优化,把场景还原一下:
首先,我们的要的表有个字段status状态存的是数据字典状态。
例如:首先我们的业务流是一个状态变更,1为未提交,2为待主管审核,3为待部长确认,4位方案已确定。
然后呢,一开始的语句是这样的,
case a.colName when '1' then '未提交' when '2' then '待主管审核' when '3' then '待部长确认' .....
这样下来,如果一个流程有10几个20几个流程这种夸张的(现实环境不知道有没有这么长的链条),那语句写法就显得很长,看起来比较碍眼。更不用说业务变动的问题,维护是很讨厌的,你想想要是流程变动,你写的case when 就必须要马上修改。
这时候我百度搜索动态的写法。但是只有一个网页有个参考答案
我把链接拉进来分享。
链接如下:
https://bbs.csdn.net/topics/390009215
启发了我的写法。
我把业务状态写进字典表里面,dd_code存状态,dd_name存对应的中文意思,然后dg_code对应是业务状态(就是业务状态专用的)。
然后写法就是
case when l.verify_status in
(select y.dd_code
from pages_dictionary_table y
where y.dg_code = 'plan_verify_status'
and l.verify_status = y.dd_code)
then
(select y.dd_name from pages_dictionary_table y where y.dg_code='plan_verify_status' and l.verify_status=y.dd_code)
else l.verify_status
end verify_status,
这种写法是把所有状态都写到字典表里面维护,这种写法有个好处就是动态case when 哪怕有几千个状态也好,你不用一个一个case when 写出来,而且维护就变成字典表的修改了,只要把新的状态加入到对应dg_code什么的,或者修改原来状态的对应dd_name就可以了。
但是缺点 就是可读性相对差一些。
上面的语句不知道还有没有优化的方法,两个select的条件是一样的,但是字段不同,所以应该是有的吧。。懒癌发作,不知道为什么竟然想写csdnbolg。。。