我在 MySQL 中有一个表,其中包含两列逗号分隔的数据(呃!),我需要重新格式化该表,以便第一列值的第 n 个索引与第二列值的第 n 个索引匹配
id | col1 | col2
----------------------------------
1 | a,b,c,d | a5,3e,7f48,943d44
结果看起来像
results
--------------
a:a5
b:3e
c:7f48
d:943d44
concat、group_concat、find_in_set 等似乎无法胜任这项工作;是否有与 php 的 array_combine() 等效的函数/过程?
最佳答案
如果没有 UDF 或存储过程的帮助,在 MySQL 中没有通用的方法可以做到这一点。但是,在某些假设下,一种近似方法是使用 SUBSTRING_INDEX
:
SELECT CONCAT(SUBSTRING_INDEX(col1, ',', 1), ':', SUBSTRING_INDEX(col2, ',', 1)) AS results
FROM yourTable
UNION ALL
SELECT CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(col1, ',', 2), ',', -1), ':',
SUBSTRING_INDEX(SUBSTRING_INDEX(col2, ',', 2), ',', -1))
FROM yourTable
UNION ALL
SELECT CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(col1, ',', 3), ',', -1), ':',
SUBSTRING_INDEX(SUBSTRING_INDEX(col2, ',', 3), ',', -1))
FROM yourTable
UNION ALL
SELECT CONCAT(SUBSTRING_INDEX(col1, ',', -1), ':', SUBSTRING_INDEX(col2, ',', -1))
FROM yourTable;
Demo
如果每条记录中始终有 4 个 CSV 项目,则此方法可行。如果没有,那么我们仍然可以使用这种方法,但它会开始变得非常难看。
如果您希望拥有多行数据,并且还希望对输出进行排序,则可以通过向查询添加计算列并执行 ORDER BY
来完成那。但总的来说,MySQL 并不能很好地处理此类 CSV 数据。如果可能,请尝试将 CSV 排除在表之外。
关于mysql将两列中的csv连接成 key 对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51529955/