MySQL中如何利用分隔符拆分字符串

向北走
向北走
发布时间:2026-10-15| 5人浏览过
原创

在 MySQL 数据库操作中,经常需要将包含多个值的字符串(如用逗号或空格分隔的 ID 列表)拆分成独立记录。本文将详细讲解如何在不编写复杂代码的情况下,使用原生 SQL 函数提取片段,以及如何在存储过程中实现完整的字符串切分并批量存入临时表。

SUBSTRING_INDEX 函数的基本用法

SUBSTRING_INDEX 是 MySQL 中最常用的字符串截取函数之一,它可以快速根据指定分隔符截取字符串的一部分。

语法结构如下:

SUBSTRING_INDEX(str, delim, count)
  • str:需要处理的原始字符串
  • delim:作为分隔符的字符(例如空格 ' ' 或逗号 ',')
  • count:截取的逻辑参数,决定从哪一侧计数

关键规则:

  • 当 count 为正数时:从左侧开始计算第 N 个分隔符,返回该分隔符左边的所有内容。
  • 当 count 为负数时:从右侧开始计算第 N 个分隔符,返回该分隔符右边的所有内容。

具体效果演示

假设表 i 中的字段 final_car_type 值为:东风风神全新AX7马赫版 DF 21(天窗版)

示例 1:取第一部分

SELECT SUBSTRING_INDEX(i.final_car_type, ' ', 1) AS result FROM i;
  • 操作说明:以空格为分隔符,从左往右数第 1 个空格之前的内容。
  • 执行结果:输出 东风风神全新AX7马赫版

示例 2:取最后一部分

SELECT SUBSTRING_INDEX(i.final_car_type, ' ', -1) AS result FROM i;
  • 操作说明:以空格为分隔符,从右往左数第 1 个空格之后的内容。
  • 执行结果:输出 21(天窗版)

使用存储过程完整拆分字符串

虽然单个切片可以使用上述函数解决,但若需将整串文本完全拆分并按行插入到结果集中,使用循环语句配合临时表的存储过程更为高效和直观。

存储过程实现步骤

以下代码展示了如何创建一个名为 proc_split_Id 的存储过程,它将输入的字符串 selectIds 按指定的 splitChar 拆分,并将每一块数据插入到临时表 Id_Result_s 中。

  1. 定义分隔符:由于存储过程中包含多条语句,首先使用 DELIMITER $$ 修改结束符,避免与默认的 ; 冲突。
  2. 创建临时表:在过程开始时检查并清空临时表,确保多次调用不会导致数据重复。
  3. 计算分隔符数量:通过对比原字符串长度与替换掉分隔符后的长度差,计算出需要循环的次数。
  4. 循环提取与插入:在 WHILE 循环中,再次嵌套使用 SUBSTRING_INDEX 来获取每个独立的子段。
  5. 事务控制:在循环开始前开启事务(START TRANSACTION),结束后提交(COMMIT),以提升大量 INSERT 操作的性能。

代码详解

DELIMITER $$
CREATE DEFINER=`root`@`%` PROCEDURE `proc_split_Id`(
    in selectIds blob(65535),
    in splitChar varchar(2)
)
BEGIN
    -- 初始化计数器 
    set @i=0; 

    -- 创建或重置临时结果表 
    CREATE TEMPORARY TABLE if not exists Id_Result_s(Id long NOT NULL);
    truncate table Id_Result_s;

    -- 计算需要切割的次数 
    SET @cnt = 1+(LENGTH(selectIds) - LENGTH(REPLACE(selectIds,splitChar,'')));
    set @i=1; 

    start transaction;
    WHILE @i <=@cnt DO          
        -- 核心拆分逻辑:利用嵌套SUBSTRING_INDEX定位中间片段 
        SET @result = REPLACE(SUBSTRING(SUBSTRING_INDEX(selectIds, splitChar, @i),
           LENGTH(SUBSTRING_INDEX(selectIds, splitChar, @i -1)) + 1),
           splitChar, '');  
       INSERT INTO Id_Result_s(Id) VALUES (@result );
		SET @i = @i + 1;   
    END WHILE;	
	commit;
    end$$
DELIMITER ;

注意事项:

  • 该过程的输入参数 selectIds 类型使用了 blob,这在某些旧版本 MySQL 中较常见用于承载大文本,现代应用中也可考虑 TEXT 或 VARCHAR。
  • 拆分出的单条结果直接插入到了临时表 Id_Result_s 的 Id 字段中。若需要更灵活的通用性,可根据业务需求调整字段名和数据类型。
  • 使用 REPLACE 替代 SUBSTRING_INDEX 的差异逻辑是为了精准获取“夹在两个分隔符之间”的内容,因为 SUBSTRING_INDEX(..., i) 包含前 i 个分隔符前的所有字符,而我们需要减去前 i-1 个的部分。

以上就是 MySQL 如何使用分隔符分割字符串的详细内容,更多关于 MySQL 处理字符串的技巧资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。