我有表,在此表中,每行包含一些列,每列包含逗号分隔值,如:
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 ........
我怎样才能做到这一点?
答案 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子句以根据此计数检查生成的数字。
在实时代码中执行此操作可能是一个非常糟糕的主意,但如果您要将现有表格转换为新格式以供将来使用,则可能是值得的。