我在mysql
中的版本低于group_concat()的值abc#123#def#456#xyz#789#10111#
现在我想运行query / stord过程,它可以在像
这样的列中打破这个字符串abc | 123 | def | 456 | xyz | 789 | 10111 |
答案 0 :(得分:0)
如果那是我真正想要的,我会更改查询以返回列名。要求MySQL将字符串放在一起然后将它们分散在中间层上似乎是浪费CPU。
有两个查询:一个用于返回连接值,另一个只返回原始值:“abc”,“123”,“def”等。
答案 1 :(得分: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#');