Как ЗАКАЗАТЬ по полю varchar как номер?

У меня проблема с сортировкой/порядком, не работающая, как мне нужно.

SELECT `proc` FROM `table` ORDER BY `proc` DESC;

Результат:

80.0 proc
70.0 proc
60.0 proc
50.0 proc
40.0 proc
200.0 proc
20.0 proc
190.0 proc
180.0 proc
170.0 proc
160.0 proc
150.0 proc
140.0 proc
130.0 proc
120.0 proc
110.0 proc
100.0 proc

Что мне нужно:

200.0 proc
190.0 proc
180.0 proc
170.0 proc
160.0 proc
150.0 proc
140.0 proc
130.0 proc
120.0 proc
110.0 proc
100.0 proc
90.0 proc
80.0 proc
70.0 proc
60.0 proc
50.0 proc
40.0 proc
20.0 proc

Как это сделать?

Ответы

Ответ 1

Похоже, что "proc" - это строка (varchar), поэтому она упорядочивается лексически. Если это так, вы можете заказать его

SELECT `proc` FROM `table` ORDER BY convert(`proc`, decimal) DESC;

Обратите внимание, что такие запросы будут очень медленными, и для любого серьезного использования лучше использовать числовые столбцы для хранения числовых данных.

Ответ 2

Поле столбца для proc - это VARCHAR или CHAR и обрабатывает его как литеральную строку - сортировка по алфавиту.

Преобразуйте столбец в двойное или плавающее или измените значение

SELECT `proc` FROM `table` ORDER BY CAST(`proc` AS decimal) DESC;

Ответ 3

Там что-то принципиально неправильно с вашим дизайном стола. Вместо использования таких значений, как '80.0 proc' в столбце VARCHAR, вы должны просто сохранить 80.0 в столбце типа REAL (или любой подходящий числовой тип, соответствующий вашим данным). Вы можете сделать динамическое преобразование, только для использования в выражении ORDER BY, но это также может ухудшить производительность вашего запроса.

Добавление "proc" к вашему тексту здесь не кажется полезным, и оно также не позволит вам выполнить простое преобразование.

Удивительно (см. che ответ), по-видимому, convert(..., decimal) способен игнорировать отстающий мусор. Это не то, на что вам следует положиться в целом.

документация по этому аспекту конверсии не особо понятна. Стоит прочитать этот раздел, чтобы знать ограничения строки/числа (что бы происходило в целом), например:

mysql> SELECT '18015376320243459' = 18015376320243459;
        -> 0

Если это поведение изменилось, вы могли бы использовать replace() в этом случае, просто чтобы избавиться от ' proc'.

Для чего-то более сложного, вы могли бы использовать регулярную замену выражения, чтобы извлечь числовое значение из вашей строки и передать его в число перед сортировкой, но это не поддерживается из ящик в MySQL, и это было бы довольно неуклюже (исправить проблему в своем источнике: тип данных столбца).

Чтобы иметь дело с вашими устаревшими данными, вы можете добавить дополнительный столбец и использовать внешнюю программу (на любом языке, который может выполнять замену регулярного выражения), что не должно быть слишком сложным.