Перейти к содержимому
Последнее обновление

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
  • Если разделитель отсутствует в строке, возвращается исходная строка
  • Если указанное количество превышает фактическое число вхождений разделителя, возвращается максимально возможная для извлечения часть строки
  • Если разделитель является пустой строкой, возвращается пустая строка
  • Если исходная строка пустая, возвращается пустая строка

Примеры​

  1. Базовый пример извлечения слева
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 |
+----------------------------------------+------------------------------------------+
  1. Извлечение справа (отрицательное количество)
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 |
+-----------------------------------------+-------------------------------------------+
  1. Обработка значений NULL
SELECT SUBSTRING_INDEX(NULL, ',', 1), SUBSTRING_INDEX('test', NULL, 1);
+--------------------------------+------------------------------------+
| SUBSTRING_INDEX(NULL, ',', 1) | SUBSTRING_INDEX('test', NULL, 1) |
+--------------------------------+------------------------------------+
| NULL | NULL |
+--------------------------------+------------------------------------+
  1. Обработка нулевого количества
SELECT SUBSTRING_INDEX('hello world', ' ', 0), SUBSTRING_INDEX('a,b,c', ',', 0);
+----------------------------------------+----------------------------------+
| SUBSTRING_INDEX('hello world', ' ', 0) | SUBSTRING_INDEX('a,b,c', ',', 0) |
+----------------------------------------+----------------------------------+
| | |
+----------------------------------------+----------------------------------+
  1. Разделитель отсутствует
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 |
+----------------------------------------+------------------------------------------+
  1. Указанное количество превышает число вхождений разделителя
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 |
+----------------------------------+-----------------------------------+
  1. Многобайтовый символ UTF-8 в качестве разделителя
SELECT SUBSTRING_INDEX('ṭṛì→ḍḍumai→hello', '→', 1), SUBSTRING_INDEX('ṭṛì→ḍḍumai→hello', '→', -1);
+-----------------------------------------------+------------------------------------------------+
| SUBSTRING_INDEX('ṭṛì→ḍḍumai→hello', '→', 1) | SUBSTRING_INDEX('ṭṛì→ḍḍumai→hello', '→', -1) |
+-----------------------------------------------+------------------------------------------------+
| ṭṛì | hello |
+-----------------------------------------------+------------------------------------------------+
  1. Разделитель из нескольких символов
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 |
+---------------------------------------------+----------------------------------------------+
  1. Пустая исходная строка
SELECT SUBSTRING_INDEX('', ' ', 1);
+-----------------------------+
| SUBSTRING_INDEX('', ' ', 1) |
+-----------------------------+
| |
+-----------------------------+

Ключевые слова​

SUBSTRING_INDEX, SUBSTRING