利用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. 测试功能
除非注明,戊辰人博客文章均为原创,转载请以链接形式标明本文地址