2013-03-08 4 views
-1

В моей таблице mysql у меня есть разделенная запятая и без разделяемых запятыми значений в столбце. Мне нужно получить значения для всех строк в столбце, и если в определенной строке есть разделенное запятыми значение, тогда значения должны возвращаться как новая строка. Например, у меня есть,Запрос Mysql для печати значений в новой строке, разделенных запятыми

a 
d,e 
f 
s,w,h 

Количество запятых не фиксировано. Я пробовал следующий запрос SELECT replace(description,',',CHAR(13)) FROM errorcodes, и он отлично работает. Единственное, что мне нужно сейчас, - это когда оно разделяется запятыми, мне нужны значения, которые должны появиться в новой строке. Сейчас он расщепляется, но дает значение в новой строке, но не в новой строке. Пожалуйста, помогите, как это сделать.

Примечание: Ожидаемый выход -

a 
d 
e 
f 
s 
w 
h 

Все в новой строке.

+0

Могу ли я узнать пример ожидаемого вывода? –

+0

@Malai: Я обновил свой вопрос – user850234

+0

Привет. Я комментирую здесь, потому что вы удалили свой тяжелый вопрос о том, что я был в середине комментариев. У вас есть 600 + rep, так что вы будете знать, что мы препятствуем «сбрасывать и запускать» вопросы в Stack Overflow. Если вам нужно регулярное выражение, поставьте код, который вы пробовали, на новый вопрос, и с чем конкретно вы столкнулись. Спасибо ':)' – halfer

ответ

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(",") дает выход в желаемом формате.

Смежные вопросы