Последнее обновление
SUBSTRING_INDEX
Описание
Функция SUBSTRING_INDEX используется для извлечения части строки по заданному разделителю. Указав количество вхождений разделителя, можно выполнять извлечение с левой или правой стороны.
Синтаксис
SUBSTRING_INDEX(<content>, <delimiter>, <field>)
Параметры
| Параметр | Описание |
|---|---|
<content> | Исходная строка, из которой извлекается подстрока. Тип: VARCHAR |
<delimiter> | Строка-разделитель. Учитывается регистр, поддерживаются многобайтовые символы. Тип: VARCHAR |
<field> | Количество вхождений разделителя. При положительном значении отсчёт ведётся слева, при отрицательном справа, при значении 0 возвращается пустая строка. Тип: INT |
Возвращаемое значение
Возвращает значение типа VARCHAR, представляющее извлечённую подстроку.
Правила извлечения:
- При field > 0: возвращается часть content до field-го вхождения разделителя слева
- При field < 0: возвращается часть content после |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) |
+-----------------------------+
| |
+-----------------------------+
Ключевые слова
SUBSTRING_INDEX, SUBSTRING