2010-11-11 7 views
0

Je reçois dessous de la valeur de group_concat() dans un veriable dans une base MySQLcomplexe requête Mysql

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

Maintenant, je veux procédure exécuter la requête/de Stord qui peut briser cette chaîne dans les colonnes comme

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

+0

besoin isabelle pour être si encombrant, quand u 'group_concat' dun utilise' # 'comme séparateur, changez-le en' | 'ou changez la requête/procédure pour accepter la variable de séparateur – ajreal

Répondre

0

Je changerais la requête pour retourner les noms de colonne si c'est ce que je voulais vraiment. Il semble inutile de demander à MySQL de mettre les chaînes ensemble et de les démonter au niveau intermédiaire.

ont deux requêtes: l'une pour retourner les valeurs concaténées et un autre seulement les valeurs brutes: "abc", "123", "DEF", etc.

+0

la première requête obtient les valeurs d'un ensemble comme utilisateur de différentes lignes . avoir à les changer dans les colonnes en utilisant la requête –

+0

n'a toujours pas de sens - moins maintenant, en fait. – duffymo

0

essayez ceci:

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

Merci. Mais je veux la production dans une seule rangée (7 colonnes) pas 7 lignes –

+0

dois-je faire pour vous alors? –

+0

oui s'il vous plaît. Je ne suis pas très familier avec les procédures stockées –