2013-10-12 120 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;