我正在寻找一个存储过程,它将一个由一个标记分隔的字符串作为参数,然后在该过程中为该字符串中的每个项目运行一个while循环。
我在mysql文档中没有看到任何可以完成此任务的内容......有没有办法做到这一点?
答案 0 :(得分:3)
我认为你需要推出自己的功能。 substring_index会派上用场:
SUBSTRING_INDEX(str,delim,count)
在分隔符delim的计数出现之前,从字符串str返回子字符串。如果count为正数,则返回最终分隔符左侧的所有内容(从左侧开始计算)。如果count为负数,则返回最终分隔符右侧的所有内容(从右侧开始计算)。搜索delim时,SUBSTRING_INDEX()执行区分大小写的匹配。
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);
-> 'www.mysql'
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2);
-> 'mysql.com'
此功能是多字节安全的。
答案 1 :(得分:3)
不幸的是,mysql不允许函数返回数组或表(我知道),所以你必须有点hackily。
这是一个存储过程示例:
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 ;
这将标记您的字符串,并将值插入名为“tokens”的表中,每行一个标记。你应该能够修改它以便很容易地做一些有用的事情。此外,您可能希望将输入长度从200增加。
答案 2 :(得分:1)
我认为你可以通过substring_index
完成你想要的任务它不像split()函数那么简单,但我确信你可以用这个函数计算出一个while循环。