2013-10-12 125 views
0

我是MySQL新手,需要一些帮助。MySQL光标逗号分隔字符串?

我有一个表,其中有包含逗号分隔的字符串,像这样一个VARCHAR列:

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 

我想创建一个光标,我可以在这样的使用循环每个cat_值串。

我必须将每个子字符串与一个设定值进行比较,然后根据该值进行一些逻辑处理。

在算法形式,这正是我需要的:

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 

我知道如何使用正常的选择光标打造外环。我只是不知道如何创建循环遍历每个逗号分隔的子字符串的内部循环。

有人可以帮忙吗?

编辑:我需要这个存储过程。

+0

您是否研究过:FIND_IN_SET()? – AgRizzo

+0

你想应用什么样的逻辑?请详细说明。你可能不需要游标来分裂或应用你的逻辑。 – peterm

回答

0

首先,一功能,以获取第n个片分隔字符串的:

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 ; 

而现在的代码,它使用该函数来遍历分隔的字符串的件:

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;