0

複数のフィールドを含む 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フィールドの行ごとに 1 つのエントリだけを保持したいと思います。このように...

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

...

このページに記載されているコードを変更してジョブを実行しようとしましたが、MySQL の専門家ではないため、思い通りに動作させることができません。上記のリンクでは、他のフィールドではなく、指定された 2 つの列を書き換えるのに適したコードが示されています。

コードを変更する方法、または別の方法で行う方法について何か助けはありますか?

4

2 に答える 2

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

そして、あなたは終わったと思います:-)

于 2012-07-03T00:43:50.783 に答える
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
于 2012-07-02T15:31:51.453 に答える