MySQL实现短路或逻辑操作

背景
突然接到一个需求,需要给我们的职位信息表增加一个字段,存放的是该职位对应的字典表中存放的编码,因为我们的职位信息表前期都是没有统一标准的,都是发布职位者自定义的,所以现在需要对职位进行模糊匹配,匹配到我们字典中规范的职位信息,然后将字典中规范职位的编码更新到职位信息表中新增的这个post_code 字段中。
要求如下:

  1. 如果能直接匹配,就用直接匹配职位名称的那条记录的code编码
  2. 如果不能直接匹配,就要找字典中包含了该职位名称的记录,然后取包含职位名称的这行记录的凑得编码
  3. 如果职位信息表中的职位是包含了字典表中的职位名称,直接用字典表的code

实现

  • 职位表中的职位信息post_code现在是缺失的情况
    在这里插入图片描述
  • 需要实现将职位表名称与字典表名称一致的职位做匹配,然后直接做更新 on 1=if(tv.name=ir.post_name 这个条件作为两个表关联
    在这里插入图片描述
  • 但是我们在职位表中用产品经理做匹配的时候发现职位表是可以匹配到字典表两条记录的,因为确实没法直接关联,然后执行了第二个if()判断。
    on 1=if(ir.post_name=tmp.name,1,if(LOCATE(ir.post_name,tmp.name)>0
    为了解决职位表可以匹配两条字典表记录的情况,于是我在where 条件最后用到了过滤条件修改的数据post_code必须为null,因为数据的修改是按照一行行的逐条进行修改的,所以数据在做更新的时候 会优先执行等职的关联条件on 1=if(tv.name=ir.post_name 然后对应的post_code 的值不在为空了,所以第二个金融产品经理的code 391742 就不会更新到职位表中,而是另外一条13230全部更新到职位表中。
    在这里插入图片描述

最终需要实现的是将所有直接等于产品经理的职位信息表中的post_code字段写入13230这个编码
在这里插入图片描述

代码

  1. 如果能直接匹配,就用直接匹配职位名称的那条记录的code编码
  2. 如果不能直接匹配,就要找字典中包含了该职位名称的记录,然后取包含职位名称的这行记录的凑得编码
  3. 如果职位信息表中的职位是包含了字典表中的职位名称,直接用字典表的code

核心部分代码

on 1=if(tv.name=ir.post_name,1,if(LOCATE(ir.post_name,tv.name)>0,1,if(LOCATE(tv.name,ir.post_name)>0,1,0)))

-- select 
-- ir.id,
-- ir.POST_NAME,
-- tv.name,
-- tv.code
-- from hrb_zp_info_request ir 

UPDATE hrb_zp_info_request ir 
join pt_code_type_value tv 
			on 1=if(tv.name=ir.post_name,1,if(LOCATE(ir.post_name,tv.name)>0,1,if(LOCATE(tv.name,ir.post_name)>0,1,0)))
			and tv.code_type='job_category'
			and tv.PARENT_CODE not like 'job_category%'
			and tv.in_use='1' 
set ir.post_code=tv.code												
where ir.post_name like '%产品经理%'
and ir.in_use='1'
and ir.post_code is null 

总结

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值