如何使用mysql中的逗号分隔符获取数据

时间:2014-06-25 08:33:31

标签: mysql sql database

我有表,在此表中,每行包含一些列,每列包含逗号分隔值,如:

 column1   |  column2            | column3
 ------------------------------------------
 1,2,3,4,5 | abc,xyz,pqr,std,bca |  etc.

现在我需要将每行转换为5行,例如:

1st row like col1 1 col2 abc col3 ........
2nd row like col1 2 col2 xyz col3.........
3st row like col1 3 col2 pqr col3 ........
4nd row like col1 4 col2 std col3.........
5st row like col1 5 col2 bca col3 ........

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

有可能但很乱。

SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(column1, ',', units.i + tens.i * 10), ',', -1) AS col1,
        SUBSTRING_INDEX(SUBSTRING_INDEX(column2, ',', units.i + tens.i * 10), ',', -1) AS col2,
        SUBSTRING_INDEX(SUBSTRING_INDEX(column3, ',', units.i + tens.i * 10), ',', -1) AS col3,
        SUBSTRING_INDEX(SUBSTRING_INDEX(column4, ',', units.i + tens.i * 10), ',', -1) AS col4
FROM sometable
CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9)units
CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9)tens

假设一行的所有列包含相同数量的逗号分隔字段,这将最多处理100个以逗号分隔的字段。

我正在使用DISTINCT消除重复项(使用substring_index的工作方式,如果少于100个逗号分隔值,则最后一个将重复,直到有100个),但您可能希望原始表是唯一键选择以避免合法的重复。另一种方法是计算行中字段中逗号分隔值的数量,并添加一个where子句以根据此计数检查生成的数字。

在实时代码中执行此操作可能是一个非常糟糕的主意,但如果您要将现有表格转换为新格式以供将来使用,则可能是值得的。