В orders.user_id тип целого числа, а в web_events.user_id_text тип строки (значения выглядят как 42). Какой вариант условия в JOIN обычно лучше отражает числовой смысл идентификатора?
AСравнивать
orders.user_id и web_events.user_id_text напрямую: полагаться на неявное приведение типов в JOINBПривести правую часть через
CAST(web_events.user_id_text AS int): сравнение в числовом типе с orders.user_idCПривести левую часть через
orders.user_id::text к строке: сравнить со строковым web_events.user_id_textDПрименить
LOWER() к обеим частям и сравнить как строки: операция приведения регистра идентификаторовПравильный ответ. Если идентификатор по смыслу числовой, лучше явно привести строковый столбец к числу через
CAST(... AS int) — это делает намерение очевидным.Разбор
Когда идентификатор по смыслу число, сравнение в числовом типе обычно понятнее и снижает риск странных несовпадений из-за пробелов или ведущих нулей. Каст текстового значения через CAST(... AS int) делает намерение явным и помогает оптимизатору. Полагаться на неявное приведение типов опасно — поведение зависит от СУБД, а грязные данные (', буквы) приводят к ошибкам.
Проверь себя · 1/3разбор после ответа
В поле phone хранится строка из 10 цифр, например 9991234567. Вам нужны первые 3 цифры (код региона) для группировки. Какое выражение подходит?
Ещё вопросы по теме «Строки и приведение типов»
- У вас есть таблицы `users(email)` и `marketing_signups(email)`. В одной системе email сохраняется как `Ivan@Example.com`, в другой — `ivan@example.com`. Какой подход в `JOIN` чаще всего решает проблему без изменения данных в таблицах?
- В таблице `products` категория хранится как `Books`, `books`, `BOOKS`. Нужно одним условием в `WHERE` отобрать все варианты категории «книги». Какой фильтр наиболее надёжен?
- В отчёте по городам вы делаете агрегацию по `city`, но видите две строки: `Moscow` и `Moscow ` (с пробелом в конце). Как исправить это прямо в запросе?
- Поле `price_text` хранит цены как текст: `2`, `10`, `100`. Аналитик написал `WHERE price_text > '10'` и получил неожиданный набор строк. Как сделать сравнение числовым?
- В `amount_text` суммы записаны как текст, но иногда встречается пустая строка `''`. Запрос `SUM(CAST(amount_text AS int))` падает. Какое выражение чаще всего решает проблему, превращая пустые строки в `NULL` перед приведением типа?
- Все вопросы по «Строки и приведение типов» →