2013-10-12 3 views
0

Je suis nouveau à MySQL alors j'ai besoin d'aide.Curseur MySQL pour une chaîne délimitée par des virgules?

J'ai une table où il y a une colonne varchar qui contient des chaînes délimitées par des virgules, comme ceci:

cat_1,cat_2,cat_3,cat_4,cat_5 
cat_6,cat_7,cat_8,cat_5 
cat_1,cat_2,cat_5 
cat_1,cat_2,cat_9,cat_4,cat_5 
cat_7,cat_5 

Je veux créer un curseur que je peux utiliser pour boucler sur chaque valeur cat_ telle chaîne.

Je dois comparer chaque sous-chaîne avec une valeur définie, puis effectuer une certaine logique en fonction de cela.

En forme algorithmique, c'est ce que je dois:

foreach row 
    foreach substring s in big_string 
      if s='cat_1' 
       --do logic 
      else if s='cat_2' 
       --do logic 
      else if s='cat_3' 
       --do logic 
      --and so on 
      end 

    end 
end 

Je sais comment créer la boucle extérieure à l'aide d'un curseur de sélection normale. Je ne sais pas comment créer la boucle interne, qui boucle sur chaque sous-chaîne délimitée par des virgules.

Quelqu'un peut-il aider?

EDIT: J'en ai besoin pour une procédure stockée.

+0

Avez-vous trouvé une recherche: FIND_IN_SET()? – AgRizzo

+0

Quel genre de logique vous essayez d'appliquer? S'il vous plaît élaborer. Vous n'avez peut-être pas besoin de curseurs pour diviser ou appliquer votre logique. – peterm

Répondre

0

Tout d'abord, une fonction pour aller chercher la pièce n-ième d'une chaîne délimitée:

DELIMITER $$ 

DROP FUNCTION IF EXISTS `string_splitter` $$ 
CREATE FUNCTION `string_splitter`(
    str text, 
    delim varchar(255), 
    pos int) RETURNS text CHARSET utf8 
BEGIN 

return replace(substring_index(str, delim, pos), concat(substring_index(str, delim, pos - 1), delim), ''); 

END $$ 

DELIMITER ; 

Et maintenant le code, qui utilise cette fonction pour itérer sur les morceaux de la chaîne délimitée:

set @str = 'cat_1,cat_2,cat_3,cat_4,cat_5'; -- replace this with the value from the cursor 
set @delim = ','; 
set @numPieces = 1 + ((length(@str) - length(replace(@str, @delim, '')))/length(@delim)); 
set @i = 1; 

while @i <= @numPieces do 
    set @piece = string_splitter(@str, @delim, @i); 
    -- do something here with @piece 
    set @i = @i + 1; 
end while; 
Questions connexes