2010-11-11 4 views
0

Я получаю ниже значения от GROUP_CONCAT() в veriable в MySQLкомплекс Mysql запрос

abc#123#def#456#xyz#789#10111# 

Теперь я хочу, чтобы запустить процедуру запроса/STORD который может разорвать эту строку в столбцах, как

аЬс | 123 | def | 456 | xyz | 789 | 10111 |

+0

серовато необходимость быть настолько громоздким, когда u 'group_concat' dun использовать' # 'в качестве разделителя, изменить его на' | 'или изменить запрос/процедуру для принятия переменной разделителя – ajreal

ответ

0

Я бы изменил запрос, чтобы возвращать имена столбцов, если это то, что я действительно хотел. Кажется пустой тратой процессора, чтобы попросить MySQL свести строки вместе, а затем разделить их на среднем уровне.

Есть два запроса: один, чтобы вернуть сцепленные значения и еще только исходные значения: "ABC", "123", "DEF" и т.д.

+0

первый запрос получает значения набора, подобного пользователю из разных строк , придется менять их в столбцах, используя запрос – 2010-11-11 12:57:50

+0

, по-прежнему не имеет смысла - сейчас, на самом деле. – duffymo

0

попробовать это:

drop procedure if exists foo; 

delimiter # 

create procedure foo 
(
in p_csv varchar(1024) 
) 
proc_main:begin 

declare v_token varchar(255); 
declare v_done tinyint unsigned default 0; 
declare v_token_idx int unsigned default 1; 

    if p_csv is null or length(p_csv) <= 0 then 
     leave proc_main; 
    end if; 

    -- split the string into tokens and put into an in-memory table... 

    create temporary table tokens(
     token_id smallint unsigned auto_increment primary key, 
     token varchar(255) 
    )engine = memory; 

    while not v_done do 
    set v_token = trim(substring(p_csv, v_token_idx, 
     if(locate('#', p_csv, v_token_idx) > 0, 
       locate('#', p_csv, v_token_idx) - v_token_idx, length(p_csv)))); 

     if length(v_token) > 0 then 
     set v_token_idx = v_token_idx + length(v_token) + 1; 
       insert into tokens (token) values(v_token); 
     else 
     set v_done = 1; 
     end if; 
    end while; 

    select * from tokens order by token_id; 

    drop temporary table if exists tokens; 

end proc_main # 

delimiter ; 

call foo('abc#123#def#456#xyz#789#10111#'); 
+0

Спасибо. Но я хочу вывод в одной строке (7 столбцов), а не 7 строк – 2010-11-11 13:04:31

+0

, тогда я сделаю это для вас? –

+0

да пожалуйста. Я не очень хорошо разбираюсь в хранимых процедурах – 2010-11-12 05:13:45