mysql如何从一个字段中截取想要的内容并给对应字段赋值

需求大概如下,content表,字段有:name、describe、d1-dn。想实现从describe中获取对应的内容,赋值到d1至dn中。describe中的内容是对d1至dn的主观描述,内容格式不一,但是一定会提到d1至dn中的某几个。

例子如下

namediscribed1d2d3d4d5
张三d1总承包一级,d2专业承包二级总承包一级专业承包二级///
李四d2专业承包一级,d5总承包特级/专业承包一级//总承包特级
王五d3专业承包二级;d5总承包一级//专业承包二级/总承包一级
请问仅使用sql语句可否实现,如何实现。不可以的话有没有什么其他方法可以实现

mysql 使用 locate判断是否包含某个字符,这个是最快的

SELECT 
name,describe,
CASE WHEN locate('d1',describe)>0 THEN 1 ELSE 0 end as d1,
CASE WHEN locate('d2',describe)>0 THEN 1 ELSE 0 end as d2,
CASE WHEN locate('d3',describe)>0 THEN 1 ELSE 0 end as d3,
CASE WHEN locate('d4',describe)>0 THEN 1 ELSE 0 end as d4,
CASE WHEN locate('d5',describe)>0 THEN 1 ELSE 0 end as d5
FROM content;

update content set d1=v.d1,d2=v.d2,d3=v.d3,d4=v.d4,d5=v.d5 from
 (SELECT 
name,describe,
CASE WHEN locate('d1',describe)>0 THEN 1 ELSE 0 end as d1,
CASE WHEN locate('d2',describe)>0 THEN 1 ELSE 0 end as d2,
CASE WHEN locate('d3',describe)>0 THEN 1 ELSE 0 end as d3,
CASE WHEN locate('d4',describe)>0 THEN 1 ELSE 0 end as d4,
CASE WHEN locate('d5',describe)>0 THEN 1 ELSE 0 end as d5
FROM content) as v
where id = v.id

建议使用python实现,思路如下:

  1. 查询数据库 id, discribe 字段:
    select id, discribe from content
    
  2. 对查出来的结果进行遍历(rets为查询结果)
    for id, discribe in rets:
  3. 对discribe按照标点符号进行进行分隔
    temp_list = discribe.split(',')或者temp_list = discribe.split(';')
  4. 取出分割后的元素前两位: d1,d2,d3,d4,d5, 对应的后面的元素也保存: value1, value2,valu3,value4
  5. 写一条更新语句: update content set d1=value1, d2=value2 .... where id=id

用子查询+字符串分拆:

img

img

或者用类似Outer apply的查询联合更新(示例仅查询)

img