В таблице customers поле lifetime_value_text хранится как текст. Сортировка ORDER BY lifetime_value_text DESC даёт 100 раньше 20. Как получить корректный порядок по величине выручки?

AORDER BY CAST(lifetime_value_text AS int) DESC, чтобы сравнение шло по числовой величине
BORDER BY lifetime_value_text DESC NULLS LAST, чтобы пропуски ушли вниз и порядок стал числовым
CORDER BY SUBSTRING(lifetime_value_text, 1, 1) DESC, чтобы упорядочить значения по первой цифре
DORDER BY lifetime_value_text COLLATE "C" DESC для бинарной сортировки по байтам строки
Правильный ответ. Текстовая сортировка сравнивает символы, а не величины; для чисел нужно явное приведение через CAST.

Разбор

Когда значение хранится как текст, ORDER BY сравнивает строки лексикографически: '100' окажется раньше '20', потому что символ '1' меньше '2'. Явное приведение к числовому типу через CAST(... AS int) (или другой подходящий числовой тип) делает сортировку корректной по величине. NULLS LAST управляет только позицией пропусков, а сортировка по подстроке или бинарной коллации остаётся текстовой и проблему не решает.

Можно заниматься бесплатно

Готовим вопросы…

Три вопроса по теме этой страницы, с объяснениями.

Продолжить в браузере

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