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
相关产品推荐
相关产品推荐

