В таблице 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 управляет только позицией пропусков, а сортировка по подстроке или бинарной коллации остаётся текстовой и проблему не решает.

Проверь себя · 1/3разбор после ответа
На ревью вы видите выражение CAST(user_id AS text) в коде Postgres. Какой вариант с оператором :: записывает то же самое приведение типа?
Тренировать SQL в Telegram

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