MySQL 自定义 split 存储过程

MySQL 没有提供 split 函数,但可以自己建立一个存储过程,将具有固定分隔符的字符串转成多行。之所以不能使用自定义函数实现此功能,是因为 MySQL 的自定义函数自能返回标量值,不能返回多行结果集。

MySQL 8:

复制代码
drop procedure if exists sp_split;
delimiter //
create procedure sp_split(p_str text, p_delimiter varchar(100))
begin
    select substring_index(substring_index(p_str, p_delimiter, lv), p_delimiter, - 1) a
      from (
	  with recursive tab1(lv) as (
           select 1 lv 
            union all
           select t1.lv + 1 from tab1 t1 
            where lv < (char_length(p_str) - char_length(replace(p_str, p_delimiter, ''))) / (char_length(p_delimiter)) + 1)
      select * from tab1
      ) t1;
end;
//
delimiter ;

MySQL 5:

复制代码
drop procedure if exists sp_split;
delimiter //
create procedure sp_split(p_str text, p_delimiter varchar(100))
begin
    select substring_index(substring_index(p_str, p_delimiter, help_topic_id + 1), p_delimiter, - 1) a
      from mysql.help_topic  
     where help_topic_id < (char_length(p_str) - char_length(replace(p_str, p_delimiter, ''))) / (char_length(p_delimiter)) + 1;
end;
//
delimiter ;

测试:

复制代码
mysql> set @a:='123,456,789';
Query OK, 0 rows affected (0.00 sec)

mysql> call sp_split(@a,',');
+------+
| a    |
+------+
| 123  |
| 456  |
| 789  |
+------+
3 rows in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> set @a:='中;;English;;混杂;;多字符分隔符';
Query OK, 0 rows affected (0.00 sec)

mysql> call sp_split(@a,';;');
+--------------------+
| a                  |
+--------------------+
| 中                 |
| English            |
| 混杂               |
| 多字符分隔符        |
+--------------------+
4 rows in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)
相关推荐
睡觉的时候不会困19 小时前
Redis 主从复制详解:原理、配置与主从切换实战
数据库·redis·bootstrap
程序员的世界你不懂21 小时前
【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇
java·前端·数据库
自学也学好编程21 小时前
【数据库】Redis详解:内存数据库与缓存之王
数据库·redis
福赖21 小时前
《MySQL基础——用户管理》
mysql·用户管理
JAVA不会写1 天前
在Mybatis plus中如何使用自定义Sql
数据库·sql
IT 小阿姨(数据库)1 天前
PgSQL监控死元组和自动清理状态的SQL语句执行报错ERROR: division by zero原因分析和解决方法
linux·运维·数据库·sql·postgresql·centos
ChinaRainbowSea1 天前
7. LangChain4j + 记忆缓存详细说明
java·数据库·redis·后端·缓存·langchain·ai编程
小马学嵌入式~1 天前
嵌入式 SQLite 数据库开发笔记
linux·c语言·数据库·笔记·sql·学习·sqlite
Java小白程序员1 天前
MyBatis基础到高级实践:全方位指南(中)
数据库·mybatis
Monly211 天前
人大金仓:merge sql error, dbType null, druid-1.2.20
数据库·sql