美文网首页
MySQL通过UDF实现Split分割函数

MySQL通过UDF实现Split分割函数

作者: 环语 | 来源:发表于2019-12-12 11:50 被阅读0次

            MySQL没有Split函数,但可以通过写UDF来实现,上网查了很多,但都有些不完美之处,比如:如果遇到不确定有多少个分隔符的情况下,想要切分后取指定位置的字符,会有可能取错或取不出来。

            因此重新写了一个支持自动计算可切分的数量,并在超过有效切分数量范围时返回空值,这样即能保证不会取错,又支持特定应用,比如我需要将一个不定长的字段(如字段可能的值有:A1/A2/A3 ,  A1/A2,  A1/A2/A3/A4),指定取分割后的第4个值,想实现的效果是当第4个值时取对应的值,如果无值时返回空值(null)。

    函数说明:

    函数功能: Split功能函数

    功能说明: 支持分隔符有多个字符.同时如果输入的位置超过可分割数量时返回空值.

    使用方法: udf_split(f_string,f_delimiter,f_order)

    示例: select udf_split('ABC||DEF||GH||I', '||', 2);

    特殊说明:

    1、当分隔符后或前无其他字符,返回的是空串,而不是空值null。

    2、当输入的位置比实际可切分的数量大时,则返回空值null。

    如执行以下语句:

    select

    udf_split(',a,b,',',',1) as split1,

    udf_split(',a,b,',',',2) as split2,

    udf_split(',a,b,',',',3) as split3,

    udf_split(',a,b,',',',4) as split4,

    udf_split(',a,b,',',',5) as split5;

    得到以下结果:

    代码实现:

    DELIMITER $$

    DROP function IF EXISTS `udf_split` $$

    CREATE FUNCTION `udf_split`

    ( f_string varchar(8000),  f_delimiter varchar(50),  f_order int)

    RETURNS varchar(500) CHARSET utf8

    BEGIN

      -- 声明变量

      declare result varchar(500) default '';

      declare totalcnt INT;

      set result = '';

      -- 计算有效数量

      set totalcnt = ((length(f_delimiter) + (length(f_string) - length(replace(f_string,f_delimiter,'')))) / length(f_delimiter));

      -- 判断输入的位置是否超过有效数量

      if f_order > 0 and f_order <= totalcnt then

        set result = reverse(substring_index(reverse(substring_index(f_string,f_delimiter,f_order)),f_delimiter,1));

      else

        set result = null;

      end if;

      return result;

    END$$

    DELIMITER ;

    测试结果:

    select txt,

    udf_split(txt,',',1) as split1,

    udf_split(txt,',',2) as split2,

    udf_split(txt,',',3) as split3,

    udf_split(txt,',',4) as split4,

    udf_split(txt,',',5) as split5,

    udf_split(txt,'||',1) as split1a,

    udf_split(txt,'||',2) as split2a,

    udf_split(txt,'||',3) as split3a,

    udf_split(txt,'||',4) as split4a,

    udf_split(txt,'||',5) as split5a

    from (

    select 'a,b,c,d' as txt union all

    select 'a,b,c' as txt union all

    select 'a,b' as txt union all

    select 'a' as txt union all

    select 'a||b||c||d' as txt union all

    select 'a||b||c||' as txt union all

    select '测||试||程||序' as txt

    ) a;

    相关文章

      网友评论

          本文标题:MySQL通过UDF实现Split分割函数

          本文链接:https://www.haomeiwen.com/subject/jggzgctx.html