mysql自定义函数,按指定规则拆分split

原创  郑建华   2020-09-11   33人阅读  2 条评论

有这样一个需求,在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

image.png

在这里要感谢一位朋友,曾先生,要不是他,这个函数还写不出来。

本文地址:https://www.zjh336.cn/?id=1971
版权声明:本文为原创文章,版权归 郑建华 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

 评论列表

  1. 超人下拉系统
    超人下拉系统 【实习生】  @回复

    这个核心函数有点不理解

  2. 采购信息
    采购信息 【实习生】  @回复

    博客很棒 支持一下 欢迎回访啊