Вопросы по теме «Строки и приведение типов»

LIKE, SUBSTRING, CONCAT, TRIM, CAST, регулярные выражения — строковые функции нужны для парсинга и очистки данных. На собеседовании могут попросить извлечь домен из email, привести строку к числу или разобрать URL. Эти задачи проверяют практический опыт работы с «грязными» данными.

Всего в этом разделе 20 вопросов. Каждый — с правильным ответом и кратким разбором теории. Разбито на 4 части по 5 вопросов.

Агрегация, GROUP BY и HAVINGДаты и времяEXPLAIN и оптимизацияВыражения и NULLJOIN и операции множествОсновы SQL-запросовПодзапросы и CTEОконные функции

Вопросы 15 из 20

1В `product_category` иногда попадают хвостовые пробелы. В отчёте по категориям вы хотите убрать дубли групп, но менять исходные данные нельзя. Что лучше сделать в запросе?
AДобавить `LIMIT 100`, чтобы не видеть дубли.
BГруппировать по очищенному значению: `GROUP BY TRIM(product_category)` (и в `SELECT` использовать тот же `TRIM(product_category)`).
CПривести категорию к `int`: `product_category::int`.
DСделать `ORDER BY TRIM(product_category)` без `GROUP BY`.
Ответ: Если группировка «размножается» из-за пробелов, нормализация выражения в `SELECT` и `GROUP BY` решает проблему.

Группировка считает строки разными, если символы отличаются, даже если различие только в пробеле. `TRIM(product_category)` приводит значения к одному виду и убирает дубликаты групп. Важно использовать одинаковое выражение и в `SELECT`, и в `GROUP BY`, чтобы результат был согласованным.

2Вы строите ключ сессии как склейку `user_id` (тип `int`) и `session_id` (тип `text`). Какой вариант корректен для конкатенации в SQL?
A`user_id + '-' + session_id`
B`CAST(user_id AS int) || '-' || session_id`
C`user_id || '-' || CAST(session_id AS int)`
D`user_id::text || '-' || session_id`
Ответ: Для конкатенации строк числовые поля обычно приводят к `text` через `CAST` или `::text`.

Оператор `||` работает со строками. Если один из операндов — число, его нужно явно привести к тексту: `user_id::text` или `CAST(user_id AS text)`. Это предотвращает ошибки типов и делает намерение запроса ясным.

3В таблице `products` категория хранится как `Books`, `books`, `BOOKS`. Вы хотите отфильтровать все варианты категории «books» в одном запросе. Какое условие в `WHERE` наиболее надежно?
A`category = 'Books'`
B`category = LOWER('Books')`
C`UPPER(category) = 'Books'`
D`LOWER(category) = 'books'`
Ответ: Чтобы сравнение не зависело от регистра, приводят обе стороны к одному регистру.

Если данные приходят из разных источников, регистр часто «гуляет». Условие `LOWER(category) = 'books'` приводит значения к единому виду перед сравнением и избегает пропусков. Это типичный способ стабилизировать фильтры в аналитических запросах.

4В поле `full_name` встречаются значения вроде `Ivan` и `ivan ` (с пробелом в конце). Вы хотите надежно отфильтровать всех пользователей с именем ivan независимо от регистра и пробелов по краям. Какое условие наиболее подходит?
A`TRIM(LOWER(full_name)) = 'ivan'`
B`full_name = 'ivan'`
C`LOWER(full_name) = 'ivan'`
D`TRIM(full_name) = 'Ivan'`
Ответ: Комбинация `TRIM` и `LOWER` делает сравнение более устойчивым к типичным проблемам текстовых данных.

В реальных данных часто встречаются лишние пробелы и разные варианты регистра. Если сравнивать «как есть», вы получите пропуски. Приведение к единому регистру (`LOWER`) и очистка пробелов по краям (`TRIM`) дают стабильное условие для фильтрации.

5В `users.phone` иногда попадают значения с ведущими/хвостовыми пробелами. Вы фильтруете `WHERE phone = '+79991234567'`, но часть пользователей не находится. Как исправить фильтр?
A`WHERE LOWER(phone) = '+79991234567'`
B`WHERE CAST(phone AS int) = 79991234567`
C`WHERE SUBSTRING(phone, 1, 3) = '+79'`
D`WHERE TRIM(phone) = '+79991234567'`
Ответ: Лишние пробелы ломают сравнение строк; `TRIM` часто решает проблему.

Даже один пробел делает строку другой, поэтому равенство в `WHERE` перестаёт совпадать. `TRIM(phone)` убирает пробелы в начале и конце, сохраняя остальную строку. Это простая и частая чистка для полей вроде телефонов и категорий.

1234

Хотите тренировать интерактивно?

В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.

Тренировать в Telegram

Другие темы: SQL

Агрегация, GROUP BY и HAVINGДаты и времяEXPLAIN и оптимизацияВыражения и NULLJOIN и операции множествОсновы SQL-запросовПодзапросы и CTEОконные функции