SPLIT_PART() в SQL — разбить строку по разделителю и взять нужную часть

SPLIT_PART делит строку по указанному разделителю и возвращает часть под номером N (нумерация с 1). Это рабочая лошадка аналитика для парсинга: домен из email, source и medium из UTM-метки, сегмент из пути URL. Функция есть в PostgreSQL (и Redshift), но её нет в SQLite и MySQL — там используют SUBSTRING_INDEX или связку instr+substr.

Синтаксис

SPLIT_PART(строка, разделитель, номер_части)

Примеры использования

Пример 1: Домен из email

SELECT email,
       SPLIT_PART(email, '@', 2) AS domain
FROM users
LIMIT 3;

Результат:

email          | domain
anna@yandex.ru | yandex.ru
ivan@ozon.ru   | ozon.ru
maria@vk.com   | vk.com

Пример 2: Разбор UTM-метки на source и medium

SELECT utm,
       SPLIT_PART(utm, '_', 1) AS source,
       SPLIT_PART(utm, '_', 2) AS medium
FROM events
LIMIT 3;

Результат:

utm         | source | medium
vk_cpc      | vk     | cpc
email_promo | email  | promo

Пример 3: Последняя часть через отрицательный индекс (PG 14+)

SELECT path,
       SPLIT_PART(path, '/', -1) AS last_segment
FROM events
LIMIT 3;

Результат:

path            | last_segment
/blog/sql/joins | joins
/catalog/phones | phones
Порешать SQL-задачи в тренажёре →

Типичная ошибка

Нумерация частей с 1; если такой части нет, возвращается пустая строка '', а не NULL — это удобно, но легко пропустить в фильтрах. С PostgreSQL 14 доступны отрицательные индексы (счёт с конца), в более старых версиях они дадут ошибку. Разделитель — это буквальная строка, а не регулярное выражение.

Где спрашивают на собеседовании

Классика собеса на парсинг колонок — идёт в паре с POSITION и SUBSTRING, когда нужно достать домен, UTM или сегмент пути без регулярок.

FAQ: частые вопросы про SPLIT_PART

Есть ли SPLIT_PART в MySQL или SQLite?

Нет, это функция PostgreSQL (и Redshift). В MySQL аналог — SUBSTRING_INDEX(str, delim, n). В SQLite встроенной функции нет: используют комбинацию instr() и substr() или рекурсивный CTE.

Что вернёт SPLIT_PART, если такой части нет?

Пустую строку '', а не NULL. Например, SPLIT_PART('vk', '_', 2) вернёт ''. Это отличает её от многих других строковых функций, поэтому проверяйте на пустую строку, а не на IS NULL.

Как взять последнюю часть строки?

В PostgreSQL 14+ передайте отрицательный индекс: SPLIT_PART(str, '/', -1) вернёт последний сегмент. На старых версиях считают число разделителей или используют reverse-трюки, а в MySQL — SUBSTRING_INDEX(str, delim, -1).

Задачи в тренажёре по теме

Вопросы с собеседований по теме

Смежные темы SQL

Строковые функции

Другие функции SQL

SUBSTR · CONCAT · REPLACE · TRIM · UPPER / LOWER · LENGTH

Открыть SQL-тренажёр (565 задач) →