拆分行字段mysql创建新列

时间:2012-07-02 15:01:45

标签: mysql stored-procedures split

我有一个包含几个字段的MySQL表;像这样:

id  name  ton           dyr
1   moo   FRET_GTR_HYU  ra
2   maa   DER_GY_TR_DB  fe
3   tee   SAME_IQ       tete
...

问题是列 ton 的每一行的内容都是独立的,但它们用符号“_”连接。

我想修改表格,将字段 ton 拆分为最终保留其他字段中的所有相同条目,但 ton 领域,像这样...

id  name  ton      dyr
1   moo   FRET     ra
1   moo   GTR      ra
1   moo   HYU      ra
2   maa   DER      fe
2   maa   GY       fe
2   maa   TR       fe
2   maa   DB       fe
3   tee   SAME     tete
3   tee   IQ       tete

...

我试图修改这个page中给出的代码来执行这项工作,但由于我不是MySQL的专家,我无法按照自己的方式工作。在上面的链接中,代码适合于重写给定的两列,而不是任何其他字段。

有关如何修改代码的任何帮助,或以其他方式进行操作?

2 个答案:

答案 0 :(得分:1)

您应该使用SUBSTRING_INDEX MySQL字符串函数。 以下内容应该返回您的要求:

INSERT INTO table2
SELECT id, name, SUBSTRING_INDEX(ton, '_', 1), dyr FROM table1
UNION
SELECT id, name, SUBSTRING_INDEX(ton, '_', -1), dyr FROM table1

答案 1 :(得分:1)

1)将table1结构复制到table2

2)将2个存储过程添加到数据库中。

CREATE PROCEDURE peixe()
BEGIN
  DECLARE done BOOLEAN DEFAULT 0;
  DECLARE i INT;
  DECLARE cursor_id CURSOR FOR SELECT id FROM table1 WHERE ton LIKE '%_%';
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
  OPEN cursor_id;
  FETCH cursor_id INTO i;
  REPEAT
    CALL split_ton(i);
    FETCH cursor_id INTO i;
  UNTIL done END REPEAT;
  CLOSE cursor_id;
END

CREATE PROCEDURE split_ton(i INT)
BEGIN
  DECLARE str_name VARCHAR(50);
  DECLARE str_ton VARCHAR(50);
  DECLARE str_ton_el VARCHAR(50);
  DECLARE str_dyr VARCHAR(50);
  DECLARE ton_size INT;

  SELECT name, ton, dyr
  INTO str_name, str_ton, str_dyr
  FROM table1 WHERE id=i;

  SET ton_size = LENGTH(str_ton) - LENGTH(REPLACE(str_ton, '_', '')) + 1;

  WHILE ton_size > 0 DO
    SET str_ton_el = SUBSTRING_INDEX(str_ton, '_', -1);
    SET str_ton = SUBSTRING_INDEX(str_ton, '_', ton_size - 1);
    INSERT INTO table2 (id, name, ton, dyr) VALUES (i, str_name, str_ton_el, str_dyr);
    SET ton_size = ton_size - 1;
  END WHILE;
END

3)最后,执行以下语句:

CALL peixe

我认为,你已经完成了: - )