-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 回答