我在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()等效的函数/过程?
答案 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;
如果每个记录中始终总是有4个CSV项目,则此方法有效。如果没有,那么我们仍然可以使用这种方法,但是它将变得非常难看。
如果您希望有多于一行的数据,并且还希望对输出进行排序,则可以通过在查询中添加一个计算列,然后对其进行ORDER BY
来实现。但总的来说,MySQL无法很好地处理此类CSV数据。尽可能将CSV保留在表格之外。