В таблице customers поле lifetime_value_text хранится как текст. Сортировка ORDER BY lifetime_value_text DESC даёт 100 раньше 20. Как получить корректный порядок по величине выручки?
A
ORDER BY CAST(lifetime_value_text AS int) DESC, чтобы сравнение шло по числовой величинеB
ORDER BY lifetime_value_text DESC NULLS LAST, чтобы пропуски ушли вниз и порядок стал числовымC
ORDER BY SUBSTRING(lifetime_value_text, 1, 1) DESC, чтобы упорядочить значения по первой цифреD
ORDER BY lifetime_value_text COLLATE "C" DESC для бинарной сортировки по байтам строкиПравильный ответ. Текстовая сортировка сравнивает символы, а не величины; для чисел нужно явное приведение через
CAST.Разбор
Когда значение хранится как текст, ORDER BY сравнивает строки лексикографически: '100' окажется раньше '20', потому что символ '1' меньше '2'. Явное приведение к числовому типу через CAST(... AS int) (или другой подходящий числовой тип) делает сортировку корректной по величине. NULLS LAST управляет только позицией пропусков, а сортировка по подстроке или бинарной коллации остаётся текстовой и проблему не решает.
Проверь себя · 1/3разбор после ответа
На ревью вы видите выражение
CAST(user_id AS text) в коде Postgres. Какой вариант с оператором :: записывает то же самое приведение типа?Ещё вопросы по теме «Строки и приведение типов»
- У вас есть таблицы `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` перед приведением типа?
- Все вопросы по «Строки и приведение типов» →