You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL中将分号分隔的键值对字符串列拆分为多列

拆分MySQL中分号分隔的键值对列为独立字段

如果已知所有可能出现的键(比如示例中的attr1到attr6),可以直接用字符串函数组合实现拆分,无需复杂逻辑。假设你的表名为your_table,以下是具体SQL实现:

SELECT
  -- 提取attr1的值,无该键时返回NULL
  IF(LOCATE('attr1=', columnName) > 0, 
     TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(columnName, 'attr1=', -1), ';', 1)),
     NULL) AS attr1,
  -- 提取attr2的值
  IF(LOCATE('attr2=', columnName) > 0, 
     TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(columnName, 'attr2=', -1), ';', 1)),
     NULL) AS attr2,
  -- 提取attr3的值
  IF(LOCATE('attr3=', columnName) > 0, 
     TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(columnName, 'attr3=', -1), ';', 1)),
     NULL) AS attr3,
  -- 提取attr4的值
  IF(LOCATE('attr4=', columnName) > 0, 
     TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(columnName, 'attr4=', -1), ';', 1)),
     NULL) AS attr4,
  -- 提取attr5的值
  IF(LOCATE('attr5=', columnName) > 0, 
     TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(columnName, 'attr5=', -1), ';', 1)),
     NULL) AS attr5,
  -- 提取attr6的值
  IF(LOCATE('attr6=', columnName) > 0, 
     TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(columnName, 'attr6=', -1), ';', 1)),
     NULL) AS attr6
FROM your_table;

代码说明:

  • LOCATE('attrX=', columnName):判断当前行是否包含目标键,避免无该键时返回错误内容
  • SUBSTRING_INDEX(columnName, 'attrX=', -1):截取attrX=之后的所有内容
  • SUBSTRING_INDEX(..., ';', 1):截取上述结果中第一个分号之前的内容,即对应键的值
  • TRIM():去除值前后的空格(适配示例中键值对之间的空格格式)
  • IF(..., ..., NULL):无目标键时返回NULL,匹配需求格式

如果需要处理动态未知的键,可以通过存储过程遍历所有唯一键,动态生成SQL语句,但这种场景复杂度较高,适合键数量不固定的情况。

内容的提问来源于stack exchange,提问作者Rahul Srikhakolanu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 11:40:59