一、函数概述
SUBSTRING_INDEX 是MySQL中用于按分隔符截取字符串的核心函数,特别适合处理包含固定分隔符的文本数据(如日志、路径、标签等)。
二、语法结构
SUBSTRING_INDEX(str, delimiter, count)
- str:被处理的原始字符串(支持字段名)
- delimiter:分隔符(区分大小写)
- count:截取方向控制参数
正数:从左往右截取前N段
负数:从右往左截取前N段
三、核心功能演示
场景1:基本截取
SELECT
SUBSTRING_INDEX('www.mysql.com', '.', 2) AS case1, -- www.mysql
SUBSTRING_INDEX('a,b,c,d', ',', -3) AS case2; -- b,c,d
场景2:获取中间内容
-- 获取第二个与第三个逗号之间的内容
SELECT SUBSTRING_INDEX(
SUBSTRING_INDEX('1,apple,2023,active', ',', 3),
',', -2
) AS result; -- apple,2023
场景3:路径处理
SELECT
SUBSTRING_INDEX('/var/log/mysql/error.log', '/', -1) AS filename, -- error.log
SUBSTRING_INDEX('/home/user/documents', '/', 2) AS path_level; -- /home
四、经典应用场景
1. 数据清洗
需求:去除用户姓名中的括号内容
SELECT
real_name,
SUBSTRING_INDEX(real_name, '(', 1) AS clean_name
FROM sys_user;
输入:"王慧(网络组)" → 输出:"王慧"
2. 日志分析
-- 从日志中提取错误码
SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(log_msg, 'ERROR=', -1), ' ', 1) AS error_code
FROM system_logs;
日志示例:[2023-08-20] ERROR=5003 Connection timeout → 输出:5003
3. 层级数据处理
-- 解析多级分类路径
SELECT
category_path,
SUBSTRING_INDEX(category_path, '>', 1) AS level1,
SUBSTRING_INDEX(SUBSTRING_INDEX(category_path, '>', 2), '>', -1) AS level2
FROM products;
示例:"电子产品>手机>安卓" → level1:电子产品,level2:手机
扫描二维码关注公众号,回复:
17615890 查看本文章

五、避坑指南
1. 分隔符注意事项
大小写敏感:SUBSTRING_INDEX('A-B-C', 'b', 1) → 返回完整字符串
特殊字符转义:处理\、%等需用ESCAPE关键字
多字符分隔符:支持多字符分隔符,如SUBSTRING_INDEX(str, '||', 2)
2. 空值处理
SELECT
SUBSTRING_INDEX(NULL, ',', 1), -- 返回NULL
SUBSTRING_INDEX('a,,b', ',', 2); -- 返回"a"
3. 性能优化
避免在WHERE条件中使用:全表扫描风险
配合虚拟列使用(MySQL 5.7+):
ALTER TABLE users
ADD COLUMN first_name VARCHAR(20)
GENERATED ALWAYS AS (SUBSTRING_INDEX(full_name, ' ', 1));