SUBSTRING_INDEX
描述
SUBSTRING_INDEX 函数用于根据指定的分隔符截取字符串的部分内容。通过指定分隔符的出现次数,可以从左侧或右侧进行截取。
语法
SUBSTRING_INDEX(<content>, <delimiter>, <field>)
参数
| 参数 | 说明 |
|---|---|
<content> | 需要截取的源字符串。类型:VARCHAR |
<delimiter> | 分隔符字符串,大小写敏感且支持多字节字符。类型:VARCHAR |
<field> | 分隔符出现的次数。正数从左计数,负数从右计数,0 返回空字符串。类型:INT |
返回值
返回 VARCHAR 类型,表示截取后的子字符串。
截取规则:
- 当 field > 0:返回从左边起第 field 个分隔符之前的内容
- 当 field < 0:返回从右边起第 |field| 个分隔符之后的内容
- 当 field = 0:返回空字符串(content 为 NULL 时返回 NULL)
- 大小写敏感的精确匹配分隔符
特殊情况:
- 如果任一参数为 NULL,返回 NULL
- 如果分隔符在字符串中不存在,返回原字符串
- 如果指定的次数超出实际分隔符数量,返回能截取到的最大部分
- 如果分隔符为空字符串,返回空字符串
- 源字符串为空,返回空字符串。
示例
- 基本的左侧截取
SELECT SUBSTRING_INDEX('hello world', ' ', 1), SUBSTRING_INDEX('one,two,three', ',', 2);
+----------------------------------------+------------------------------------------+
| SUBSTRING_INDEX('hello world', ' ', 1) | SUBSTRING_INDEX('one,two,three', ',', 2) |
+----------------------------------------+------------------------------------------+
| hello | one,two |
+----------------------------------------+------------------------------------------+
- 右侧截取(负数计数)
SELECT SUBSTRING_INDEX('hello world', ' ', -1), SUBSTRING_INDEX('one,two,three', ',', -1);
+-----------------------------------------+-------------------------------------------+
| SUBSTRING_INDEX('hello world', ' ', -1) | SUBSTRING_INDEX('one,two,three', ',', -1) |
+-----------------------------------------+-------------------------------------------+
| world | three |
+-----------------------------------------+-------------------------------------------+
- NULL 值处理
SELECT SUBSTRING_INDEX(NULL, ',', 1), SUBSTRING_INDEX('test', NULL, 1);
+--------------------------------+------------------------------------+
| SUBSTRING_INDEX(NULL, ',', 1) | SUBSTRING_INDEX('test', NULL, 1) |
+--------------------------------+------------------------------------+
| NULL | NULL |
+--------------------------------+------------------------------------+
- 零次数处理
SELECT SUBSTRING_INDEX('hello world', ' ', 0), SUBSTRING_INDEX('a,b,c', ',', 0);
+----------------------------------------+----------------------------------+
| SUBSTRING_INDEX('hello world', ' ', 0) | SUBSTRING_INDEX('a,b,c', ',', 0) |
+----------------------------------------+----------------------------------+
| | |
+----------------------------------------+----------------------------------+
- 分隔符不存在的情况
SELECT SUBSTRING_INDEX('hello world', ',', 1), SUBSTRING_INDEX('no-delimiter', '|', -1);
+----------------------------------------+------------------------------------------+
| SUBSTRING_INDEX('hello world', ',', 1) | SUBSTRING_INDEX('no-delimiter', '|', -1) |
+----------------------------------------+------------------------------------------+
| hello world | no-delimiter |
+----------------------------------------+------------------------------------------+
- 超出分隔符数量
SELECT SUBSTRING_INDEX('a,b,c', ',', 5), SUBSTRING_INDEX('a,b,c', ',', -5);
+----------------------------------+-----------------------------------+
| SUBSTRING_INDEX('a,b,c', ',', 5) | SUBSTRING_INDEX('a,b,c', ',', -5) |
+----------------------------------+-----------------------------------+
| a,b,c | a,b,c |
+----------------------------------+-----------------------------------+
- UTF-8 多字节字符分隔符
SELECT SUBSTRING_INDEX('ṭṛì→ḍḍumai→hello', '→', 1), SUBSTRING_INDEX('ṭṛì→ḍḍumai→hello', '→', -1);
+-----------------------------------------------+------------------------------------------------+
| SUBSTRING_INDEX('ṭṛì→ḍḍumai→hello', '→', 1) | SUBSTRING_INDEX('ṭṛì→ḍḍumai→hello', '→', -1) |
+-----------------------------------------------+------------------------------------------------+
| ṭṛì | hello |
+-----------------------------------------------+------------------------------------------------+
- 多字符分隔符
SELECT SUBSTRING_INDEX('data::field::value', '::', 2), SUBSTRING_INDEX('data::field::value', '::', -1);
+---------------------------------------------+----------------------------------------------+
| SUBSTRING_INDEX('data::field::value', '::', 2) | SUBSTRING_INDEX('data::field::value', '::', -1) |
+---------------------------------------------+----------------------------------------------+
| data::field | value |
+---------------------------------------------+----------------------------------------------+
- 源字符串为空
SELECT SUBSTRING_INDEX('', ' ', 1);
+-----------------------------+
| SUBSTRING_INDEX('', ' ', 1) |
+-----------------------------+
| |
+-----------------------------+