我想将来自一个表的多值字符串拆分为一个由主键和拆分字符串结果组成的新表。
示例字符串:
table1.field1(主键)= 100,table1.field2 ='abc,def,ghi'
在新表(table2)中,结果应如下所示:
**column1** **column2**
**row1** 100 'abc'
**row2** 100 'def'
**row3** 100 'ghi'
**row4** etc etc
我知道如何拆分table1.field2,但由于数据太大,我需要自动将结果插入table2。如果我手动完成,则需要很长时间。有谁可以帮助我?
答案 0 :(得分:1)
这是使用准备好的声明的解决方案:
__far
输出:
DROP TABLE IF EXISTS concatenatedVals;
CREATE TABLE concatenatedVals(`key` INTEGER UNSIGNED, concatenatedValue CHAR(255));
DROP TABLE IF EXISTS splitVals;
CREATE TABLE splitVals(`key` INTEGER UNSIGNED, splitValue CHAR(255));
INSERT INTO concatenatedVals VALUES (100, 'abc,def,ghi'), (200, 'jkl,mno,pqr');
SELECT * FROM concatenatedVals;
SET @VKey := '';
SET @VExec := (SELECT CONCAT('INSERT INTO splitVals VALUES', TRIM(TRAILING ',' FROM GROUP_CONCAT(CONCAT('(', @VKey:= `key`, ', \'', REPLACE(concatenatedValue, ',', CONCAT('\'), (', @VKey, ', \'')), '\'),') SEPARATOR '')), ';') FROM concatenatedVals);
PREPARE stmt FROM @VExec;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SELECT * FROM splitVals;
如果您有任何问题,请与我们联系。
关于这个问题,我如何考虑源表中的行数意味着预准备语句超过max-concat长度的情况,请参阅以下示例。由于这使用SELECT * FROM splitVals;
+------+------------+
| key | splitValue |
+------+------------+
| 100 | abc |
| 100 | def |
| 100 | ghi |
| 200 | jkl |
| 200 | mno |
| 200 | pqr |
+------+------------+
6 rows in set (0.00 sec)
循环,因此它必须位于存储过程中。这可以适用于允许表名和列名作为参数使用进一步的WHILE
AND预处理语句来动态地构建和执行命令。但是现在,请更改我的示例中的表名和列名以匹配您的数据,它应该可以正常工作。
CONCAT
此致
詹姆斯