0Pricing
SQL Interview Prep · Урок

Разбор и форматирование строк

SUBSTRING, позиция, разделение и изменение регистра в разных диалектах

«Разбор и форматирование строк» — бесплатный урок SQL Interview Prep на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Interview Prep содержит 4 уроков всего.

Почему спрашивают о строковых функциях

Реальные данные бывают неаккуратными: полные имена нужно разделять, из адресов электронной почты — извлекать домены, в идентификаторах могут быть встроены коды, а регистр символов бывает неоднородным. Интервьюеры используют обработку строк, чтобы проверить, умеете ли Вы очищать и преобразовывать текст без выгрузки данных в отдельную программу.

Как и в случае с датами, функции стандартизированы лишь частично, поэтому важно знать концепцию и распространенные варианты.

  • Извлечение подстрок и определение позиции
  • Объединение строк
  • Разделение и замена
  • Преобразование регистра и удаление пробелов по краям

SUBSTRING и определение позиции

SUBSTRING(s FROM start FOR length) — форма, соответствующая стандарту SQL; большинство систем также принимает SUBSTRING(s, start, length). Позиции в строках отсчитываются от единицы — это классическая ошибка смещения на единицу для программистов, привыкших к языкам с отсчетом от нуля.

POSITION(sub IN s) (или STRPOS/CHARINDEX) находит позицию начала подстроки и возвращает 0, если подстрока не найдена.

SELECT
  SUBSTRING('INV-2024-042' FROM 5 FOR 4) AS year,   -- '2024'
  POSITION('-' IN 'INV-2024-042')        AS first_dash; -- 4

Извлечение домена электронной почты

Классический разобранный пример. Найдите символ @, затем возьмите всё после него. Сочетание POSITION и SUBSTRING — универсальный подход.

В PostgreSQL также можно использовать SPLIT_PART(email, '@', 2): такой вариант читается понятнее, и его стоит назвать идиоматичным решением.

-- Portable
SELECT SUBSTRING(email FROM POSITION('@' IN email) + 1) AS domain
FROM users;

-- Postgres idiom
SELECT SPLIT_PART(email, '@', 2) AS domain FROM users;

Объединение строк в разных диалектах

Объединение строк зависит от диалекта, и интервьюеры ожидают, что Вы знаете различия.

  • Стандарт SQL, PostgreSQL и Oracle: оператор ||.
  • MySQL: CONCAT(a, b, c) (оператор || по умолчанию является логическим OR).
  • SQL Server: + для строк или CONCAT().

CONCAT() обрабатывает NULL как пустую строку, тогда как || и + обычно превращают весь результат в NULL, если любой операнд равен NULL. Это может стать источником трудноуловимой ошибки.

-- Postgres
SELECT first_name || ' ' || last_name AS full_name FROM people;

-- MySQL / SQL Server
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM people;

Ловушка конкатенации с NULL

Продолжая предыдущий пример: если last_name равен NULL, выражение first_name || ' ' || last_name в PostgreSQL возвращает NULL и уничтожает всё имя.

Защитное решение — применить COALESCE к частям, которые могут содержать NULL, или использовать CONCAT_WS (объединение с разделителем): эта функция пропускает NULL и вставляет разделитель только между присутствующими значениями.

-- Safe in Postgres / MySQL
SELECT CONCAT_WS(' ', first_name, last_name) AS full_name FROM people;

-- Or guard each part
SELECT first_name || ' ' || COALESCE(last_name, '') FROM people;

Разделение строк

Задача «извлечь третий сегмент из кода с дефисами» проверяет умение разделять строки. В PostgreSQL функция SPLIT_PART(s, delim, n) напрямую возвращает часть с указанным номером и является самым удобным инструментом.

В MySQL нет прямой функции разделения; идиоматичный прием — вложенные вызовы SUBSTRING_INDEX: взять первые n частей, а затем последнюю из них.

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

-- MySQL: third part of a-b-c-d
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('a-b-c-d', '-', 3), '-', -1); -- 'c'

Замена, удаление пробелов и дополнение

Операции очистки, которые интервьюеры ожидают увидеть сразу:

  • REPLACE(s, from, to) заменяет все вхождения.
  • TRIM(s) удаляет начальные и конечные пробелы; TRIM(BOTH 'x' FROM s) удаляет указанный символ.
  • LPAD(s, len, ch) / RPAD дополняют значение до фиксированной ширины — это удобно для добавления нулей к идентификаторам.
SELECT
  REPLACE('555.123.4567', '.', '-') AS phone,   -- 555-123-4567
  TRIM('   hello   ')               AS clean,   -- 'hello'
  LPAD('42', 6, '0')                AS padded;   -- '000042'

Преобразование регистра и длина

Нормализация регистра необходима перед сравнением или группировкой текста. UPPER и LOWER поддерживаются повсеместно; INITCAP (PostgreSQL и Oracle) делает первые буквы слов заглавными.

LENGTH(s) в большинстве систем возвращает количество символов, но следует помнить: в SQL Server используется LEN(), а в некоторых конфигурациях LENGTH считает байты для многобайтного текста. Упомяните эту особенность при работе с данными, содержащими символы вне ASCII.

SELECT
  LOWER(email)        AS email_norm,
  INITCAP(city)       AS city_pretty,  -- Postgres
  LENGTH(description)  AS chars
FROM places;

Сопоставление с шаблоном за пределами LIKE

Когда возможностей LIKE недостаточно, интервьюеры любят проверить знание регулярных выражений. В PostgreSQL есть оператор ~ и функции REGEXP_REPLACE / REGEXP_MATCHES; в MySQL — REGEXP / REGEXP_SUBSTR.

Например, можно оставить в строке с номером телефона только цифры. Регулярное выражение позволяет сделать это в одну строку вместо цепочки вызовов REPLACE.

-- Postgres: strip non-digits
SELECT REGEXP_REPLACE('(555) 123-4567', '[^0-9]', '', 'g')
  AS digits; -- '5551234567'

Более глубокий пример: нормализация и удаление дубликатов имен

Комбинированная задача по очистке данных. Представьте, что имена приходят с лишними пробелами и неоднородным регистром, из-за чего появляются ложные дубликаты. Сначала нормализуйте данные, затем выполните группировку.

Удалите пробелы по краям, сверните внутренние последовательности пробелов с помощью регулярного выражения и переведите текст в нижний регистр перед подсчетом уникальных значений. Именно такое многошаговое рассуждение интервьюеры оценивают особенно высоко.

SELECT
  LOWER(REGEXP_REPLACE(TRIM(name), '\s+', ' ', 'g')) AS norm_name,
  COUNT(*) AS occurrences
FROM contacts
GROUP BY 1
ORDER BY occurrences DESC;

Приведение строк к числам и датам

Строковые столбцы часто содержат значения, которые должны быть числами или датами. CAST(s AS INTEGER) или сокращенная запись PostgreSQL s::int выполняет преобразование, но завершается ошибкой на некорректных входных данных.

Для дат функция TO_DATE(s, 'YYYY-MM-DD') (PostgreSQL и Oracle) разбирает значение по явно заданной маске формата. Это самый безопасный подход, поскольку он устраняет неоднозначность порядка дня и месяца.

SELECT
  CAST(qty_text AS INTEGER)            AS qty,
  TO_DATE(order_str, 'DD/MM/YYYY')     AS order_date
FROM staging;

Быстрая проверка

Рассуждайте о поведении NULL при объединении строк.

Повторение: разбор и форматирование строк

Ключевые моменты, которые следует запомнить перед собеседованием:

  • Позиции в строках отсчитываются от единицы; сочетание SUBSTRING и POSITION позволяет извлекать значения по позиции.
  • Объединяйте строки с помощью || (PostgreSQL), CONCAT (MySQL) или + (SQL Server) и помните о распространении NULL; предпочтительно использовать CONCAT_WS.
  • Разделяйте строки с помощью SPLIT_PART (PostgreSQL) или вложенных вызовов SUBSTRING_INDEX (MySQL).
  • REPLACE, TRIM, LPAD, UPPER/LOWER очищают и нормализуют данные; регулярные выражения справляются со сложными случаями.
  • Нормализуйте регистр и пробелы до группировки, чтобы избежать ложных дубликатов.

Часто задаваемые вопросы

Урок «Разбор и форматирование строк» бесплатный?

Да — полный текст урока «Разбор и форматирование строк» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Interview Prep, подпишись на CoddyKit PRO. Курс SQL Interview Prep содержит 4 уроков всего.

Чему я научусь в уроке «Разбор и форматирование строк»?

SUBSTRING, позиция, разделение и изменение регистра в разных диалектах Ты практикуешь SQL Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать SQL Interview Prep?

Предыдущий опыт не требуется. SQL Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Разбор и форматирование строк»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке SQL Interview Prep?

Да. Каждый урок SQL Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Арифметика дат и интервалы
  2. Округление дат и распределение по интервалам
  3. Разбор и форматирование строк
  4. Часовые пояса и временные метки
← Назад к SQL Interview Prep