MySql里split函数的实现

最近在做公司的狐小E项目(https://www.hixiaoe.com/),要转Mysql数据库,但是Mysql 数据库自己是没有split函数,就在stackoverflow上搜了一个实现,这里也继续分享出去,取之于网络,用之于网格,大家一起学习,进步。

以下就函数的具体实现。

DROP FUNCTION IF EXISTS fn_split;

DELIMITER $$

CREATE FUNCTION  fn_split ( s TEXT , del CHAR(1) , i INT)
RETURNS VARCHAR(1024)
DETERMINISTIC -- always returns same results for same input parameters
SQL SECURITY INVOKER 
BEGIN
    DECLARE n INT ;
    -- get max number of items
    SET n = LENGTH(s) - LENGTH(REPLACE(s, del, '')) + 1;
    IF i > n THEN
        RETURN NULL ;
    ELSE
        RETURN SUBSTRING_INDEX(SUBSTRING_INDEX(s, del, i) , del , -1 ) ;
    END IF;
END$$

DELIMITER ;

建好了函数,我们看一下效果。

下面是使用的结果。

再来看一下,我们把i这个参数换成一个不超出范围的值会怎么样

        到这里,基础的split就已经实现了。如果没有复杂需求的,看到这里就可以了。

在实际使用中,咱们可能会有不同的需求,比如要求你把一个字符串,用split处理成一个表返回,这种情况,我们又不知道字符串里的分割符有多少个。我相信很多人会选择先取出分隔符的数据,再循环来取的方式来处理。虽然这样能取出结果,但是我感觉还是麻烦了一些。下面是我的方法。

我在库里建了一张表(t_split)

在这里,需要说明一下,t_split表中name列,也可以建成int型的。

在表里灌了一些数据(根据我项目的情况,我这里灌了1000条),下面截图只显示了部分数据。

看到t_split表中的数据,你是不是能理解name列,为什么也可以建成int型的么?

继续看这个表的使用,有了这张表,我们用split函数就方便了。下面就是使用效果

如果name列是int型的,那么 上面的语句里的id列就可以替换成那么列了。为什么要用name列呢,最后告诉大家。

有了t_split这张表(需要初始化数据),我们就不需要关心要分割的字符串里有多少个分隔符。这样用起来就方便多了。

但是如果你的串里要超过1000个分隔符,t_split里的数据就要灌多些。

这种使用的方法需要注意几个点。t_split表主键要有自增设置,生成的ID要从1开始连续断。如果你的MySql要做主从复制,那请在做主从复制前,把这个表里的数据先生成好,否则做好主从复制后,主键ID是主机上,和备机上都是跳号生成,这样再用t_split配合split函数取据就会漏数据了,大家一定要注意。

如果你建t_split表的时候,把name列建成了int型的,灌数据的时候 name列里的值也是从1到N连续不段的,那么就不用担心Mysql主从复制的时候自增ID不连续的问题

很高兴能够参加狐小E项目(https://www.hixiaoe.com/)的开发,期望在这个项目里能更快的成长起来,学习到更多Mysql的知识,也希望各位多多指点。

如果大家有更好的方法,欢迎一起讨论,一起成长吧~

posted @ 2020-07-06 14:25  wuweimin  阅读(11925)  评论(0编辑  收藏  举报