Строка заказа SQL как число

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

При сортировке они воспринимаются как символы, а не как числа.

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

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

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

1 10 2 3 4 5 6 7 8 9

Как я могу сделать так, чтобы они казались упорядоченными по номерам по возрастанию?

 Oded04 авг. 2012 г., 14:16
Конечно, вы должны были хранить данные в виде числа, а не строки.
 Glutexo13 февр. 2018 г., 07:20
@Oded У вас могут быть произвольные данные (например, настройки), которые вы хотите упорядочить по числовому значению только в очень особых случаях.

Ответы на вопрос(9)

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

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

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

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

или упорядочить по части поля что-нибудь вроде «ensymbols13 »,« TenSymbols1222 »; и т.п.

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

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

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

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 цифр целочисленных значений.

So the result will be 123456789 123456788 123456787 ... 100 99 ... 2 1

I can not make them INT due to some other depending circumstances.

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

Решение Вопроса

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

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

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

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

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 */
 07 сент. 2016 г., 17:11
@superphonic: результат будетdecimal.
 09 мая 2014 г., 21:56
Первый вариант является наиболее подходящим, второй имеет дополнительный шаг, но он работает, тем не менее.
 23 февр. 2015 г., 04:42
и если вы смешали строку и число и хотите, чтобы они оба были отсортированы, используйте & quot; порядок по col * 1, col & quot;
 04 авг. 2012 г., 14:40
MySQL автоматически преобразует строку в число для умножения на1
 Jamol04 авг. 2012 г., 14:38
заказ по цв * 1 работает отлично. Что за магия стоит за этим? Извините, я не профессионал, так что это может быть глупый вопрос, но как * 1 заставляет его меняться на число?

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

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

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

 30 дек. 2018 г., 08:34
Вы можете просто использовать1 - ISNUMERIC(ID) вместо(CASE WHEN ISNUMERIC(ID) = 1 THEN 0 ELSE 1 END) изменить 0 на 1 и наоборот.

(Для людей, которые используют JPA 2.0, где не разрешается кастинг)

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

РЕДАКТИРОВАТЬ: работает только для натуральных чисел

 17 июн. 2016 г., 02:09
Это будет работать только для натуральных чисел.
 20 июн. 2015 г., 03:47
длина, но идея работает!
 19 февр. 2015 г., 02:02
В самом деле? & Quot; длина & Quot ;? Кажется маловероятным, что на самом деле сработало. ;-)
 27 февр. 2015 г., 22:17
это хорошо, это работало со столбцом, который также содержит как int, так и string
 22 нояб. 2018 г., 10:26
отличное решение без каких-либо типов кастинга и жонглирования, +1

select * from tablename
order by cast(columnname as int) asc
 17 мая 2018 г., 12:11
можешь объяснить почему?

Another and simple way

ORDER BY ABS(column_name)

Ваш ответ на вопрос