Строка заказа SQL как номер

У меня есть числа, сохраненные как VARCHAR в базе данных MySQL. Я не могу сделать их INT из-за некоторых других зависимых обстоятельств.

Он принимает их как символ не как число при сортировке.

В базе данных у меня

1 2 3 4 5 6 7 8 9 10...

На моей странице он показывает упорядоченный список:

1 10 2 3 4 5 6 7 8 9

Как я могу заставить его отображаться по номерам по возрастанию?

Ответ 1

Если возможно, вам следует изменить тип данных столбца на число, если вы все равно сохраняете числа.

Если вы не можете этого сделать, приведите значение вашего столбца к integer с помощью

select col from yourtable
order by cast(col as unsigned)

или неявно, например, с помощью математической операции, которая вызывает преобразование в число

select col from yourtable
order by col + 0

Кстати, MySQL преобразует строки слева направо. Примеры:

string value  |  integer value after conversion
--------------+--------------------------------
'1'           |  1
'ABC'         |  0   /* the string does not contain a number, so the result is 0 */
'123miles'    |  123 
'$123'        |  0   /* the left side of the string does not start with a number */

Ответ 2

Другой способ, без использования одиночного актера.

(Для тех, кто использует JPA 2.0, где не допускается кастинг)

select col from yourtable
order by length(col),col

EDIT: работает только для целых положительных чисел

Ответ 3

В столбце, который я сортирую, есть любая комбинация альфа-и числовой, поэтому я использовал предложения в этом сообщении в качестве отправной точки и придумал это.

DECLARE @tmp TABLE (ID VARCHAR(50));
INSERT INTO @tmp VALUES ('XYZ300');
INSERT INTO @tmp VALUES ('XYZ1002');
INSERT INTO @tmp VALUES ('106');
INSERT INTO @tmp VALUES ('206');
INSERT INTO @tmp VALUES ('1002');
INSERT INTO @tmp VALUES ('J206');
INSERT INTO @tmp VALUES ('J1002');

SELECT ID, (CASE WHEN ISNUMERIC(ID) = 1 THEN 0 ELSE 1 END) IsNum
FROM @tmp
ORDER BY IsNum, LEN(ID), ID;

Результаты

ID
------------------------
106
206
1002
J206
J1002
XYZ300
XYZ1002

Надеюсь, что это поможет

Ответ 4

Другой и простой способ

ORDER BY ABS(column_name)

Ответ 5

Другой способ преобразования.

Если у вас есть строковое поле, вы можете преобразовать его или его числовую часть следующим образом: добавьте начальные нули, чтобы все целые строки имели равную длину.

ORDER BY CONCAT( REPEAT(  "0", 18 - LENGTH( stringfield ) ) , stringfield ) 

или упорядочить по частям поля нечто вроде "tensymbols13", "tensymbols1222" и т.д.

ORDER BY CONCAT( REPEAT(  "0", 18 - LENGTH( LEFT( stringfield , 10 ) ) ) , LEFT( stringfield , 10 ) ) 

Ответ 6

Я искал также поля сортировки, у которых есть префикс письма. Вот что я нашел решение. Это может помочь тем, кто ищет то же решение.

Значения полей:

FL01,FL02,FL03,FL04,FL05,...FL100,...FL123456789

select SUBSTRING(field,3,9) as field from table order by SUBSTRING(field,3,10)*1 desc

SUBSTRING(field,3,9) я положил 9, потому что 9 достаточно для меня, чтобы удерживать максимум 9 цифр целых значений.

Таким образом, результат будет 123456789 123456788 123456787 ... 100 99 ... 2 1

Ответ 7

Это будет обрабатывать отрицательные числа, дроби, строки, все:

ORDER BY ISNUMERIC(col) DESC, Try_Parse(col AS decimal(10,2)), col;

Ответ 8

Это работает для меня.

select * from tablename
order by cast(columnname as int) asc

Ответ 9

Измените свое поле как INT вместо VARCHAR.

Я не могу сделать их INT из-за некоторых других зависимых обстоятельств.

Затем сначала исправьте зависимости. В противном случае вы работаете над реальной основной проблемой. Использование MySQL CAST - это вариант, но он маскирует вашу плохую схему, которая должна быть исправлена.