有这样一个需求,在mysql数据库中,使用函数的方式,将如下字符串:200-20-1122,555-20-33326,555-20-333234
转换成:1122,33326,333234
那要如何实现呢?
核心函数:
substring_index(str,delim,count)
str:要处理的字符串
delim:分隔符
count:计数
例子:
str=www.wikibt.com
substring_index(str,'.',1)
结果是:www
substring_index(str,'.',2)
结果是:www.wikibt
也就是说,如果count是正数,那么就是从左往右数,第N个分隔符的左边的全部内容 相反,如果是负数,那么就是从右边开始数,第N个分隔符右边的所有内容,
如:substring_index(str,'.',-2)
结果为:wikibt.com
有人会问,如果我要中间的的wikibt怎么办?
很简单的,两个方向,从右数第二个分隔符的右边全部,再从左数的第一个分隔符的左边,
substring_index(substring_index(str,'.',-2),'.',1);
函数代码:
CREATE FUNCTION `f_split_sub`(source VARCHAR(2000), split VARCHAR(2),split2 VARCHAR(2)) RETURNS varchar(500) CHARSET utf8 BEGIN #返回字符串 DECLARE ret VARCHAR(500) DEFAULT ''; #获取源字符串中 split 的个数+1 SET @dotLen = LENGTH(source) - LENGTH(REPLACE(source, ',', '')) + 1; #设置下标 用于循环 SET @index = 1; #根据split的个数进行循环 当split个数+1 大于1时 WHILE @index < @dotLen DO #先将源字符串按split截取到当前下标位置 如200-20-1122,555-20-33326 #然后将该字符串按split2截取最后一部分字符串 如33326 #再将处理后的字符串拼接到返回字符串中 SET ret = CONCAT(ret, SUBSTRING_INDEX(SUBSTRING_INDEX(source, split, @index), split2, -1), ','); #下标自增 SET @index = @index + 1; END WHILE; #当split个数+1 等于1时单独处理 IF @index = @dotLen #按上述规则 直接截取最后 THEN RETURN CONCAT(ret, SUBSTRING_INDEX(SUBSTRING_INDEX(source, split, -1), split2, -1)); END IF; RETURN ret; END
在这里要感谢一位朋友,曾先生,要不是他,这个函数还写不出来。
发表评论