Поле price_text хранит цены как текст: 2, 10, 100. Аналитик написал WHERE price_text > '10' и получил неожиданный набор строк. Как сделать сравнение числовым?
AОставить как есть и ориентироваться на лексикографическое сравнение строк в
WHEREBЗаменить
> на LIKE '1%', и для текстовых цен это даст корректный отбор по величинеCСделать явное приведение типа:
WHERE CAST(price_text AS int) > 10 для числового сравненияDИспользовать
WHERE LENGTH(price_text) > 2 как замену числовому сравнению по разрядностиПравильный ответ. Сравнение текстов и чисел — это разные операции: для числовой логики нужно явное приведение типа.
Разбор
Текст в WHERE сравнивается лексикографически, поэтому '100' ведёт себя не как число 100, а как строка, начинающаяся с символа '1'. Если поле фактически хранит число в виде строки, нужно явно привести его к числовому типу через CAST(price_text AS int) или price_text::int. Тогда сравнение будет соответствовать бизнес-смыслу. LIKE и LENGTH сравнивают форму строки, а не её числовое значение, и не дают корректного порядка чисел.
Проверь себя · 1/3разбор после ответа
Поле
price_text хранит цены как текст: 2, 10, 100. Аналитик написал WHERE price_text > '10' и получил неожиданный набор строк. Как сделать сравнение числовым?Ещё вопросы по теме «Строки и приведение типов»
- У вас есть таблицы `users(email)` и `marketing_signups(email)`. В одной системе email сохраняется как `Ivan@Example.com`, в другой — `ivan@example.com`. Какой подход в `JOIN` чаще всего решает проблему без изменения данных в таблицах?
- В таблице `products` категория хранится как `Books`, `books`, `BOOKS`. Нужно одним условием в `WHERE` отобрать все варианты категории «книги». Какой фильтр наиболее надёжен?
- В отчёте по городам вы делаете агрегацию по `city`, но видите две строки: `Moscow` и `Moscow ` (с пробелом в конце). Как исправить это прямо в запросе?
- В `amount_text` суммы записаны как текст, но иногда встречается пустая строка `''`. Запрос `SUM(CAST(amount_text AS int))` падает. Какое выражение чаще всего решает проблему, превращая пустые строки в `NULL` перед приведением типа?
- В таблице `customers` поле `lifetime_value_text` хранится как текст. Сортировка `ORDER BY lifetime_value_text DESC` даёт `100` раньше `20`. Как получить корректный порядок по величине выручки?
- Все вопросы по «Строки и приведение типов» →