CodeRang
Темы SQL

LIKE SQL: поиск по строке и строковые функции

LIKE SQL используется для поиска строк по текстовому шаблону. Разберём LIKE и шаблоны % и _, а также SUBSTRING, длину строки, проверку «строка содержит», конкатенацию и другие операции с текстом.

Обновлено · Команда SQL Arena

Что потренируете

  • Нормализовать текст через LOWER и TRIM
  • Разбирать строки с SPLIT_PART и SUBSTRING
  • Искать шаблоны через LIKE и ILIKE
  • Собирать несколько значений через STRING_AGG
  • Безопасно работать с конкатенацией и NULL

Пример задачи в тренажёре

Так выглядит задача в SQL Arena: условие, редактор, результат и схема базы.

Пред.След.Случайная
ЗаданиеОтправкиAI Mentor
Найти повторяющиеся домены в контактных данных

В contact_notes хранится текст контакта клиента. Адреса могут содержать пробелы по краям и буквы в разном регистре. Нужно взять строки, похожие на email, извлечь часть после символа @, привести её к единому виду и вернуть только домены, встретившиеся минимум два раза. Результат должен содержать domain и количество контактов contacts, а сортировка — идти сначала по убыванию количества, затем по имени домена.

Запрос 1PostgreSQLv16
SELECT
  LOWER(TRIM(SPLIT_PART(contact_text, '@', 2))) AS domain,
  COUNT(*) AS contacts
FROM contact_notes
WHERE contact_text ILIKE '%@%'
GROUP BY 1
HAVING COUNT(*) >= 2
ORDER BY contacts DESC, domain;
Отправить
Результатcustomerscontact_notes
Ответ принят

Как работает LIKE SQL и обработка строк

Внутреннее выражение SPLIT_PART(contact_text, '@', 2) делит строку по символу @ и берёт вторую часть. Для alice@example.com это example.com. Такой способ удобен, когда разделитель известен и структура строки проста. SUBSTRING решает похожие задачи иначе: можно вырезать диапазон по позиции или использовать шаблон. Например, SUBSTRING(code FROM 1 FOR 3) берёт первые три символа. Выбор зависит от того, ищем ли мы часть между разделителями или участок по правилу.

После разделения TRIM удаляет пробелы по краям, а LOWER переводит буквы в нижний регистр. Без этих двух шагов 'Example.com', 'EXAMPLE.COM' и 'example.com ' стали бы разными значениями при GROUP BY. Нормализацию лучше выполнять до сравнения или группировки, а не пытаться исправлять результат после агрегации. WHERE с ILIKE проверяет наличие символа @ без учёта регистра; здесь регистр для самого шаблона не важен, но ILIKE показывает типичный способ регистронезависимого поиска в PostgreSQL.

После нормализации GROUP BY собирает одинаковые домены вместе. HAVING COUNT(*) >= 2 оставляет только повторяющиеся, а ORDER BY делает результат однозначным. В других строковых задачах часто появляется STRING_AGG: он собирает значения нескольких строк в одну строку через указанный разделитель. Для конкатенации важно помнить про NULL: выражение first_name || ' ' || middle_name может стать NULL целиком, если middle_name равен NULL. В таких случаях применяют COALESCE или функцию CONCAT, в зависимости от нужного поведения.

LIKE сравнивает строку с шаблоном: символ % означает любое количество символов, включая ноль, а _ — ровно один произвольный символ. Поэтому условие name LIKE '%sql%' ищет значения, внутри которых встречается последовательность sql. Чувствительность к регистру зависит от СУБД и настроек сравнения; например, PostgreSQL дополнительно поддерживает ILIKE для регистронезависимого поиска. SUBSTRING извлекает часть строки, функции длины возвращают количество символов, а конкатенация объединяет несколько строк. Удаление строки — другая операция: для удаления записи из таблицы используется DELETE, а не строковая функция.

SQLPostgreSQL v16
SELECT
  LOWER(TRIM(SPLIT_PART(contact_text, '@', 2))) AS domain,
  COUNT(*) AS contacts
FROM contact_notes
WHERE contact_text ILIKE '%@%'
GROUP BY 1
HAVING COUNT(*) >= 2
ORDER BY contacts DESC, domain;
Результат запроса
domaincontacts
example.com3
news.io2
work.org2

Ошибки в LIKE SQL и строковых функциях

01

Группировать текст до нормализации

Если сразу выполнить GROUP BY по исходному значению, строки с разным регистром или лишними пробелами попадут в разные группы. LOWER и TRIM нужно применять к тому выражению, которое участвует в сравнении, группировке или проверке уникальности.

02

Путать LIKE и точное равенство

LIKE ищет по шаблону, где % означает любое количество символов, а _ — один символ. Условие value LIKE 'abc' без специальных символов почти эквивалентно обычному равенству и не ищет abc внутри строки. Для поиска подстроки нужен шаблон вроде '%abc%'.

03

Забывать о NULL при склейке строк

В PostgreSQL оператор || распространяет NULL: если одна из частей равна NULL, всё выражение может стать NULL. Для необязательных фрагментов сначала задайте замену через COALESCE либо используйте CONCAT, понимая его правила обработки NULL.

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

Курс «Регулярные выражения»

После нормализации доменов можно перейти к задачам, где строку приходится не только разделять, но и проверять или преобразовывать по формату. Среди бесплатных Easy-задач есть маскирование номера карты, проверка телефонов на 11 цифр, извлечение промокода после метки и поиск дат в ISO-формате. Более сложные упражнения работают с историей платежей, последовательностями страниц и маскированием текста. Если SPLIT_PART и SUBSTRING уже понятны, продолжить тему удобно курсом «Регулярные выражения»: он нужен там, где простой позиции или одного разделителя уже недостаточно.

Частые вопросы

Как работает LIKE SQL?

LIKE сравнивает текстовое значение с шаблоном. В шаблоне % соответствует любой последовательности символов, а _ — одному произвольному символу.

Как проверить в SQL, что строка содержит текст?

Один из вариантов — использовать LIKE с символами % вокруг искомого фрагмента, например column LIKE '%text%'. Особенности регистра зависят от конкретного SQL-диалекта и настроек.

Как работает SUBSTRING SQL?

SUBSTRING извлекает часть исходной строки по позиции, длине или другому поддерживаемому диалектом правилу. Например, можно получить несколько первых символов или фрагмент из середины строки.

Как узнать длину строки в SQL?

Для этого используются функции длины строки, название которых зависит от СУБД. Они возвращают количество символов или, для некоторых функций и типов, количество байтов.

Как объединить строки в одну в SQL?

Строки можно объединять оператором конкатенации или специальной функцией, в зависимости от SQL-диалекта. При работе с NULL важно учитывать, как конкретный оператор или функция обрабатывает отсутствующие значения.

Практика LIKE SQL и работы со строками

В SQL Arena у каждой задачи свои таблицы, а решение проверяется на скрытых данных, поэтому запрос должен работать не только на показанном примере. Бесплатно доступны 292 задачи на четырёх диалектах, а после базовых строковых функций можно перейти к курсу «Регулярные выражения».

Решать задачи на строки