复杂的Mysql查询

时间:2010-11-11 12:51:56

标签: mysql

我在mysql

中的版本低于group_concat()的值
abc#123#def#456#xyz#789#10111#

现在我想运行query / stord过程,它可以在像

这样的列中打破这个字符串

abc | 123 | def | 456 | xyz | 789 | 10111 |

2 个答案:

答案 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#');