背景
突然接到一个需求,需要给我们的职位信息表增加一个字段,存放的是该职位对应的字典表中存放的编码,因为我们的职位信息表前期都是没有统一标准的,都是发布职位者自定义的,所以现在需要对职位进行模糊匹配,匹配到我们字典中规范的职位信息,然后将字典中规范职位的编码更新到职位信息表中新增的这个post_code 字段中。
要求如下:
- 如果能直接匹配,就用直接匹配职位名称的那条记录的code编码
- 如果不能直接匹配,就要找字典中包含了该职位名称的记录,然后取包含职位名称的这行记录的凑得编码
- 如果职位信息表中的职位是包含了字典表中的职位名称,直接用字典表的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这个编码
代码
- 如果能直接匹配,就用直接匹配职位名称的那条记录的code编码
- 如果不能直接匹配,就要找字典中包含了该职位名称的记录,然后取包含职位名称的这行记录的凑得编码
- 如果职位信息表中的职位是包含了字典表中的职位名称,直接用字典表的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
总结