mysql concat csv从两列转换为密钥对

时间:2018-07-26 02:02:08

标签: mysql

我在MySQL中有一个表,其中包含两列以逗号分隔的数据(ugh!),我需要对其进行重新格式化,以便第一列值的第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()等效的函数/过程?

1 个答案:

答案 0 :(得分:0)

在MySQL中,没有UDF或存储proc的帮助,没有通用的方法。但是,在某些假设的前提下,一种近似方法是利用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;

enter image description here

Demo

如果每个记录中始终总是有4个CSV项目,则此方法有效。如果没有,那么我们仍然可以使用这种方法,但是它将变得非常难看。

如果您希望有多于一行的数据,并且还希望对输出进行排序,则可以通过在查询中添加一个计算列,然后对其进行ORDER BY来实现。但总的来说,MySQL无法很好地处理此类CSV数据。尽可能将CSV保留在表格之外。