Mysql split函数字符串分割实现代码

发布时间:2020-02-10编辑:脚本学堂
本文介绍下,mysql数据库中split函数的实现方法,也是借助mysql存储过程来实现的,有需要的朋友参考下。

本节内容:
mysql/ target=_blank class=infotextkey>mysql数据库中实现split函数的例子。

--场景:有A B两表,A表中的某一字段bids存放着一个B表主键的数组如3,4,5 而这个时候要做关联查询时,理想情况应该可以这样做
 

复制代码 代码示例:
select b.* from A a,B b where b.id in (a.bids.split(','))

但是mysql并不支持这样做,也没有提供类似的做法。

有一种变态的做法就是给bids做一下处理,就是
在bids的前后都加上逗号, 这样bids就变成,3,4,5, 此时利用模糊查询来做关联即可,做法如下:
 

复制代码 代码示例:
select b.* from A a, B b where CONCAT(CONCAT(',',a.bids),',') LIKE CONCAT(CONCAT('%,',b.id),',%')

当b的id=3时候的查询相当于执行
 

复制代码 代码示例:
select b.* from A a, B b where  ',3,4,5,' LIKE  '%,3,%'

----真实例子----
 

复制代码 代码示例:
SELECT t.*
FROM tea_material_trade t ,tea_process_product p WHERE p.id =2 AND  CONCAT(CONCAT(',',p.tradeids),',') LIKE CONCAT(CONCAT('%,',t.id),',%')

--注意,这样的效率恐怕比较低,小数据量应该没有问题,大数据量估计不能这么做

mysql存储过程实现split函数:
 

复制代码 代码示例:

DELIMITER $$

USE `teasys`$$

DROP PROCEDURE IF EXISTS `proc_split`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_split`(
    inputstring VARCHAR(1000),
    delim CHAR(1)
)
BEGIN
    DECLARE strlen INT;
    DECLARE last_index INT;
    DECLARE cur_index INT;
    DECLARE cur_char VARCHAR(200);
    DECLARE len INT;
    SET cur_index=1;
    SET last_index=0;
    SET strlen=LENGTH(inputstring); 
    DROP TABLE IF EXISTS splittable;
    CREATE TEMPORARY TABLE splittable(
        id INT AUTO_INCREMENT,
        VALUE VARCHAR(20),
        PRIMARY KEY (`ID`),
        UNIQUE KEY `ID` (`ID`)
    ) ;
    WHILE(cur_index<=strlen) DO   
    BEGIN
        IF SUBSTRING(inputstring FROM cur_index FOR 1)=delim OR cur_index=strlen THEN
            SET len=cur_index-last_index-1;
            IF cur_index=strlen THEN
               SET len=len+1;
            END IF;
            INSERT INTO splittable(`value`)VALUES(SUBSTRING(inputstring FROM (last_index+1) FOR len));
            SET last_index=cur_index;
        END IF;
        SET cur_index=cur_index+1;
    END;
    END WHILE;
END$$

DELIMITER ;

//mysql split函数的调用方法
CALL proc_split('a,b,c',',');
SELECT * FROM splittable