-1

私のmysqlテーブルでは、列にコンマで区切られた値とコンマで区切られていない値の両方があります。列のすべての行の値を取得する必要があります。特定の行にコンマで区切られた値がある場合、値は新しい行として返されます。たとえば、私は持っています、

a
d,e
f
s,w,h

カンマの数は固定されていません。次のクエリを試しましたが、SELECT replace(description,',',CHAR(13)) FROM errorcodes正常に機能します。今必要なのは、コンマで分割するときに、新しい行に値を入力する必要があることだけです。現在、分割されていますが、新しい行ではなく新しい行に値が示されています。方法を教えてください。

注: 期待される出力は-

a
d
e
f
s
w
h

すべて新しい行に。

4

1 に答える 1

0

カスタム関数を作成し、目的を解決しました。これが必要な人は、以下のコードを参照して、それに応じてテーブル名と列名を変更できます。

DELIMITER $$

DROP PROCEDURE IF EXISTS explode_table $$
CREATE PROCEDURE explode_table(bound VARCHAR(255))

  BEGIN

    DECLARE value VARCHAR(255);
    DECLARE occurance INT DEFAULT 0;
    DECLARE i INT DEFAULT 0;
    DECLARE splitted_value VARCHAR(255);
    DECLARE done INT DEFAULT 0;
    DECLARE cur1 CURSOR FOR SELECT errorcodes.description
                                         FROM errorcodes
                                         WHERE errorcodes.description != '';
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    DROP TEMPORARY TABLE IF EXISTS table2;
    CREATE TEMPORARY TABLE table2(
    `value` VARCHAR(255) NOT NULL
    ) ENGINE=Memory;

    OPEN cur1;
      read_loop: LOOP
        FETCH cur1 INTO value;
        IF done THEN
          LEAVE read_loop;
        END IF;

        SET occurance = (SELECT LENGTH(value)
                                 - LENGTH(REPLACE(value, bound, ''))
                                 +1);
        SET i=1;
        WHILE i <= occurance DO
          SET splitted_value =
          (SELECT REPLACE(SUBSTRING(SUBSTRING_INDEX(value, bound, i),
          LENGTH(SUBSTRING_INDEX(value, bound, i - 1)) + 1), ',', ''));

          INSERT INTO table2 VALUES (splitted_value);
          SET i = i + 1;

        END WHILE;
      END LOOP;

      SELECT * FROM table2;
    CLOSE cur1;
  END; $$

呼び出すだけCALL explode_table(",")で、目的の形式で出力が得られます。

于 2013-03-08T08:00:43.157 に答える