利用MySQL存储过程分割字符串
MySQL存储过程可用于分割字符串,现有一段字符串,如:"12,14,17,19",要把它按逗号(,)分割,然后用于SQL中的 where in 条件查询。
1. 计算可分割成多少个字符串(func_split_strlen)
DELIMITER $$
DROP FUNCTION IF EXISTS `func_split_strlen`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `func_split_strlen`(
f_string varchar(200), -- 传入字符串
f_delimiter varchar(5) -- 分割符
) RETURNS int(11)
begin
return 1+( length(f_string) - length(replace(f_string,f_delimiter, '')) );
end $$
DELIMITER ;
2. 拆分字符串函数(func_split)
DELIMITER $$
DROP FUNCTION IF EXISTS `func_split`$$
-- 功能:从 f_string 中以 f_delimiter 提取第 f_order 个字符
CREATE DEFINER=`root`@`localhost` FUNCTION `func_split`(
f_string varchar(200), -- 传入字符串
f_delimiter varchar(5), -- 分割符
f_order int -- 分割
) RETURNS varchar(255) CHARSET utf8 -- 返回字符串
begin
declare result varchar(255) default '';
set result = reverse(
substring_index(
reverse(substring_index(f_string,f_delimiter,f_order)),
f_delimiter,
1
)
);
return result;
end $$
DELIMITER ;
3. 存储过程编写(sp_split_str)
DELIMITER $$
DROP PROCEDURE IF EXISTS `sp_split_str` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_split_str`(
IN f_string varchar(1000), -- 要分割的字符串
IN f_delimiter varchar(5) -- 分割符
)
BEGIN
declare cnt int default 0;
declare i int default 0;
set cnt = func_split_strlen(f_string, f_delimiter);
DROP TABLE IF EXISTS `tmp_split`;
create temporary table `tmp_split`(
`strs` varchar(128) not null
) DEFAULT CHARSET=utf8;
while i < cnt
do
set i = i + 1;
insert into tmp_split(`strs`) values (
reverse(substring_index(
reverse(substring_index(f_string,f_delimiter,i)),
f_delimiter,
1)
)
);
end while;
END $$
DELIMITER ;
4. 测试功能
除非注明,戊辰人博客文章均为原创,转载请以链接形式标明本文地址
