oracle case when 动态写法

今天优化代码,发现了一个数据库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。。。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值