用MySQL存储过程分割字符串

本文介绍了一种使用MySQL存储过程实现字符串分割的方法,并通过创建函数和存储过程实现了字符串的拆分,最后通过测试验证了其正确性。

MySQL存储过程可以用于分割字符串,下面就为您详细介绍这种MySQL存储过程的用法,供您参考学习之用。

现有一段字符串,如apple,banana,orange,pears,grape,要把它按照逗号(,)分割成:

apple
banana
orange
pears
grape

然后使用where in()方法可以查询。

1、具体函数:

函数:func_split_TotalLength 

DELIMITER $$ 

DROP function IF EXISTS `func_split_TotalLength` $$ 

CREATE DEFINER=`root`@`%` FUNCTION `func_split_TotalLength` 

(f_string varchar(1000),f_delimiter varchar(5)) RETURNS int(11) 

BEGIN 

    # 计算传入字符串的总length 

    return 1+(length(f_string) - length(replace(f_string,f_delimiter,''))); 

END$$ 

DELIMITER; 

函数:func_split 

DELIMITER $$ 

DROP function IF EXISTS `func_split` $$ 

CREATE DEFINER=`root`@`%` FUNCTION `func_split` 

(f_string varchar(1000),f_delimiter varchar(5),f_order intRETURNS varchar(255) CHARSET utf8 

BEGIN 

    # 拆分传入的字符串,返回拆分后的新字符串 

        declare result varchar(255) default ''

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

        return result; 

END$$ 

DELIMITER; 

存储过程:splitString 

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `splitString` $$ 

CREATE PROCEDURE `splitString` 

(IN f_string varchar(1000),IN f_delimiter varchar(5)) 

BEGIN 

拆分结果 

declare cnt int default 0; 

declare i int default 0; 

set cnt = func_split_TotalLength(f_string,f_delimiter); 

DROP TABLE IF EXISTS `tmp_split`; 

create temporary table `tmp_split` (`status` varchar(128) not nullDEFAULT CHARSET=utf8; 

while i < cnt 

do 

    set i = i + 1; 

    insert into tmp_split(`status`) values (func_split(f_string,f_delimiter,i)); 

end while; 

END$$ 

DELIMITER; 

2、测试是否能成功分割

call splitString("apple,banana,orange,pears,grape",","); 

select * from tmp_split; 

运行结果如下,说明分割成功:

mysql> call splitString("apple,banana,orange,pears,grape",",");
select * from tmp_split;
Query OK, 1 row affected

+--------+
| status |
+--------+
| apple  |
| banana |
| orange |
| pears  |
| grape  |
+--------+
5 rows in set

mysql>

3、应用where in()查询

先传入字符串,分割后保存在临时表tmp_split 

call splitString("apple,banana,orange,pears,grape",","); 

将查询的结果作为其他查询的条件来使用 

select * from fruit where in(select * from tmp_split); 

以上就是利用MySQL存储过程分割字符串的方法介绍。

 

MySQL没有内置的`split`函数,不过可以借助以下几种方法实现字符串分割: ### 使用SUBSTRING_INDEX函数 `SUBSTRING_INDEX`函数的语法为`SUBSTRING_INDEX(待截取字符串,截取数据依据字符,截取字符的位置)`。当第三个参数为正数时,取第`n`个分隔符之前的所有字符;为负数时,取倒数第`n`个分隔符之后的所有字符 [^3]。 示例: ```sql -- 取第4个分隔符之前的所有字符 SELECT SUBSTRING_INDEX('0,1,626,691,692,',',',4); -- 输出 0,1,626,691 -- 取倒数第2个分隔符之后的所有字符 SELECT SUBSTRING_INDEX('0,1,626,691,692,',',',-2); -- 输出 691,692, ``` 若要获取特定位置的分割字符串,可结合`REVERSE`函数: ```sql -- 取到第4个字符串 SELECT REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX('0,1,626,691,692,',',',4)), ',', 1)); -- 输出 691 ``` ### 使用存储过程 可以创建一个存储过程`splitString()`来实现字符串分割: ```sql DROP PROCEDURE IF EXISTS `splitString`; DELIMITER $$ CREATE PROCEDURE `splitString`(IN f_string VARCHAR(1000), IN f_delimiter VARCHAR(5)) BEGIN DECLARE cnt INT DEFAULT 0; DECLARE i INT DEFAULT 0; SET cnt = LENGTH(f_string) - LENGTH(REPLACE(f_string, f_delimiter, '')) + 1; DROP TABLE IF EXISTS temp_split_string; CREATE TEMPORARY TABLE temp_split_string(id INT AUTO_INCREMENT PRIMARY KEY, val VARCHAR(50)); WHILE (i < cnt) DO INSERT INTO temp_split_string(val) SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(f_string, f_delimiter, i + 1), f_delimiter, -1); SET i = i + 1; END WHILE; SELECT * FROM temp_split_string; DROP TABLE IF EXISTS temp_split_string; END $$ DELIMITER ; ``` 调用该存储过程: ```sql CALL splitString('0,1,626,691,692', ','); ``` ### 使用自定义函数 可以定义一个函数来实现类似`split`的功能: ```sql DELIMITER // CREATE FUNCTION split_part(f_string VARCHAR(1000), f_delimiter VARCHAR(5), f_order INT) RETURNS VARCHAR(255) DETERMINISTIC BEGIN DECLARE result VARCHAR(255); SET result = REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(f_string, f_delimiter, f_order)), f_delimiter, 1)); RETURN result; END // DELIMITER ; -- 调用函数 SELECT split_part('0,1,626,691,692', ',', 4); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值