首页/数据/SQL 速查/SUBSTRING_INDEX 与 split_part 按分隔符切分
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条
函数速查60 条
变更与事务52 条性能与执行计划72 条

SUBSTRING_INDEX 与 split_part 按分隔符切分

按分隔符取第 N 段或某段之前/之后的内容:解析路径、IP、版本号、逗号串时很实用。

SQL 速查数据更新于 2026-10-12

MySQL

MySQL
SELECT SUBSTRING_INDEX('a.b.c', '.', 2);    -- 'a.b'(前 2 段)
SELECT SUBSTRING_INDEX('a.b.c', '.', -1);   -- 'c'(倒数第 1 段起)
SELECT SUBSTRING_INDEX('a.b.c', '.', -2);   -- 'b.c'

PostgreSQL

PostgreSQL
SELECT split_part('a.b.c', '.', 2);   -- 'b'(1 起)
-- PostgreSQL 14 起支持负索引
SELECT split_part('a.b.c', '.', -1);  -- 'c'
MySQLcount 为正取左侧,为负取右侧;找不到分隔符时返回原串
PostgreSQLsplit_part(str, delim, n) 取第 n 段,段不存在返回空串
区别MySQL 返回“某段之前/之后”,PG 返回“第几段”,语义不同

易错点

  • SUBSTRING_INDEX(x, ',', 2) 是“前两段合并”而不是“第 2 段”,与 split_part 的第 2 段语义不同
  • 用逗号串存多值时拆分再 JOIN 无法走索引,规范做法是拆关系表(或 JSON 多值索引)

数据来源与参考

  • MySQL 8.0 Reference Manual · SUBSTRING_INDEX
  • PostgreSQL Documentation · String Functions and Operators
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌