2009-07-03 92 views
2

我正在尋找編寫一個存儲過程,該存儲過程將一個由令牌分隔的字符串作爲參數,然後在過程中爲該字符串中的每個項目運行一個while循環。有沒有類似於mySql中的split()方法?

我沒有看到任何可以完成這項任務的mysql文檔......有沒有辦法做到這一點?

回答

3

不幸的是,mysql不讓函數返回數組或表(我知道),所以你必須做一點這樣做。

下面是一個示例存儲過程:每行

DELIMITER $$ 

create function splitter_count (str varchar(200), delim char(1)) returns int 
    return (length(replace(str, delim, concat(delim, ' '))) - length(str)) $$ 

CREATE PROCEDURE tokenize (str varchar(200), delim char(1)) 
BEGIN 
    DECLARE i INT DEFAULT 0; 
    create table tokens(val varchar(50)); 
    WHILE i <= splitter_count(str, delim) DO 
    insert into tokens(val) select(substring_index(SUBSTRING_INDEX(str, delim, i+1), delim, -1)); 
    SET i = i + 1; 
    END WHILE; 

END $$ 

DELIMITER ; 

這將令牌化的字符串,值插入到一個名爲「令牌」表,一個令牌。你應該可以修改它來很容易地做一些有用的事情。另外,您可能希望將輸入長度從200增加。

1

我想你需要推出自己的功能。 SUBSTRING_INDEX會派上用場:

SUBSTRING_INDEX(str,delim,count)

返回從字符串str的分隔符delim中的計數發生前的子字符串。如果count是正數,則返回最後一個分隔符左邊的數字(從左數起)。如果計數爲負數,則返回最後一個分隔符右邊的數字(從右數起)。 SUBSTRING_INDEX()在搜索delim時執行區分大小寫的匹配。

mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2); 
     -> 'www.mysql' 
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2); 
     -> 'mysql.com' 

該函數是多字節安全的。

1

我認爲你可以做到你通過substring_index

想要的東西它不只是一個拆分()函數的簡單,但我敢肯定,你可以制定出一個while循環使用此功能。

相關問題