mysql 逗号分隔的id转为逗号分隔的名称

   今天处理一个需求,表字段中存的是以逗号分割的code,另一张表中存放着code对应的code_name,现在又要要求把表中的字段的code转换成code_name并以逗号分割,形式和表字段相同。

需求说明:​

达到的效果:

 

为了解决这个问题我就想到以前用sqlserver写的split函数,准备拿过来修改下,结果发现两个create function 语法不通,试图修改了下然后发现mysql貌似不支持表变量。这下完了,就不能把逗号分割的code以表的形式传出来去匹配了。然后去网上找mysql的split函数发现怎么这么麻烦,写一个函数,还要先创建两个函数做铺垫。果断放弃了。

然后找了一些资料用mysql自带的函数解决了这个问题

1、INSTR函数(INSTR相当于sqlserver的CharIndex函数)

INSTR(字段名, 字符串)

这个函数返回字符串在某一个字段的内容中的位置, 没有找到字符串返回0,否则返回位置(从1开始)

select GROUP_CONCAT(code_name) from t_fix_code

where INSTR((select engine_number from t_inventory_tmp where id =1 ),code)>0 and length(code)=8

虽然感觉貌似可以用了,但是有个问题就是如果以逗号分割的code在不通的长度都对应一个code_name的话匹配出来的结果会增多。还有instr函数子查询只能返回一行,无法进行整表匹配。不过还是可以解决一条的问题。

就对INSTR重新运用了下

select a.engine_number,GROUP_CONCAT(b.code_name)

from t_inventory_tmp a

join t_fix_code b

on INSTR(a.engine_number,b.code)>0 and length(code)=8

group by a.engine_number

这个解决了问题但是条件里面有一条length(code) = 8 简称我必须要先明确code的长度并且还要统一长度,负责就会出现匹配结果变多,还是很尴尬。

2、FIND_IN_SET函数

假如字符串str在N子链以逗号分割组成的字符串列表strlist 中,则返回值的范围在1到N之间。 如果str不在strlist 或strlist 为空字符串,则返回值为0。

关于FIND_IN_SET用法细节我还是不太清楚,有时间再了解下。

select b.engine_number,GROUP_CONCAT(code_name) as tran_name

from t_fix_code a,t_inventory_tmp b

where FIND_IN_SET(a.code,b.engine_number) > 0

group by b.engine_number

或者

select b.engine_number,GROUP_CONCAT(code_name) as tran_name

from t_fix_code a

join t_inventory_tmp b ON FIND_IN_SET(a.code,b.engine_number) > 0

group by b.engine_number


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值