在 MySQL 里面,字符串处理非常常见

这时候就经常会用到:

SUBSTRING_INDEX()

很多人第一次看到这个函数会有点懵

因为它和:

LEFT()
RIGHT()
SUBSTRING()

这种函数不太一样

但实际上,它的逻辑非常简单


一、SUBSTRING_INDEX 基本语法

SUBSTRING_INDEX(str, delim, count)

参数解释:

参数 含义
str 原字符串
delim 分隔符
count 取第几个分隔位置

二、最核心的理解

这个函数本质上就一句话:

按照某个分隔符,把字符串切开,然后取其中一部分。

重点在于:

count

是正数还是负数

因为:

  • 正数 → 从左往右数
  • 负数 → 从右往左数

三、count 为正数(从左往右)

先看字符串:

'a,b,c,d'

1.count = 1

SELECT SUBSTRING_INDEX('a,b,c,d', ',', 1);

含义:

从左往右,
找到第1个逗号,
取它前面的内容

结果:

a

2.count = 2

SELECT SUBSTRING_INDEX('a,b,c,d', ',', 2);

含义:

从左往右,
找到第2个逗号,
取它前面的内容

结果:

a,b

3.count = 3

SELECT SUBSTRING_INDEX('a,b,c,d', ',', 3);

结果:

a,b,c

四、count 为负数(从右往左)

这个是很多人最容易懵的地方。

记住一句话:

负数就是从右边开始数。


1.count = -1

SELECT SUBSTRING_INDEX('a,b,c,d', ',', -1);

含义:

从右往左,
找到第1个逗号,
取它后面的内容

结果:

d

2.count = -2

SELECT SUBSTRING_INDEX('a,b,c,d', ',', -2);

含义:

从右往左,
找到第2个逗号,
取它后面的内容

结果:

c,d

3.count = -3

SELECT SUBSTRING_INDEX('a,b,c,d', ',', -3);

结果:

b,c,d

五、一张图彻底理解

原字符串:

a,b,c,d

位置:

a , b , c , d
    ↑   ↑   ↑
    1   2   3

正数

1 → a
2 → a,b
3 → a,b,c

从左边开始取。


负数

-1 → d
-2 → c,d
-3 → b,c,d

从右边开始取。


六、实际开发中的经典用法


1.获取邮箱后缀

比如:

abc@qq.com

想获取:

qq.com

写法:

SELECT SUBSTRING_INDEX(
    'abc@qq.com',
    '@',
    -1
);

结果:

qq.com

2.获取文件后缀

比如:

test.jpg

获取:

jpg

写法:

SELECT SUBSTRING_INDEX(
    'test.jpg',
    '.',
    -1
);

3.获取 IP 最后一段

192.168.1.100

获取:

100

写法:

SELECT SUBSTRING_INDEX(
    '192.168.1.100',
    '.',
    -1
);

4.获取路径最后一级目录

/home/user/mysql

获取:

mysql

写法:

SELECT SUBSTRING_INDEX(
    '/home/user/mysql',
    '/',
    -1
);

七、嵌套使用(非常重要)

这个函数最强的地方:

可以套娃

比如:

a,b,c,d

想取:

b

怎么办?


第一步

先取前两个:

SELECT SUBSTRING_INDEX(
    'a,b,c,d',
    ',',
    2
);

结果:

a,b

第二步

再从右边取一个:

SELECT SUBSTRING_INDEX(
    SUBSTRING_INDEX(
        'a,b,c,d',
        ',',
        2
    ),
    ',',
    -1
);

结果:

b

八、新手最容易犯的错


1.搞反正负数

记住:

正数 → 左边
负数 → 右边

2.以为 count 是“字符数”

不是。

它代表:

第几个分隔符

不是第几个字符。


3.分隔符不存在

比如:

SELECT SUBSTRING_INDEX(
    'abcd',
    ',',
    1
);

因为没有逗号。

结果会直接返回:

abcd

九、最后总结(核心记住)

SUBSTRING_INDEX 本质就一句话:

按照某个分隔符切割字符串。


正数

从左往右取

负数

从右往左取

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐