MySQL字符串处理神器:SUBSTRING_INDEX函数深度解析

一、函数概述

SUBSTRING_INDEX 是MySQL中用于按分隔符截取字符串的核心函数,特别适合处理包含固定分隔符的文本数据(如日志、路径、标签等)。

二、语法结构

SUBSTRING_INDEX(str, delimiter, count)
  1. str:被处理的原始字符串(支持字段名)
  2. delimiter:分隔符(区分大小写)
  3. 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));
  

猜你喜欢

转载自blog.csdn.net/qq_41924536/article/details/146182792
今日推荐