Вопрос по string, sql, numbers, mysql, sql-order-by – Строка заказа SQL как число

106

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

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

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

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

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

1 10 2 3 4 5 6 7 8 9

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

Конечно, вы должны были хранить данные в виде числа, а не строки. Oded
@Oded У вас могут быть произвольные данные (например, настройки), которые вы хотите упорядочить по числовому значению только в очень особых случаях. Glutexo

Ваш Ответ

9   ответов
2

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

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

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

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

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

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

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

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

2

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

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

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

55

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

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

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

В самом деле? & Quot; длина & Quot ;? Кажется маловероятным, что на самом деле сработало. ;-)
длина, но идея работает!
Это будет работать только для натуральных чисел.
это хорошо, это работало со столбцом, который также содержит как int, так и string
отличное решение без каких-либо типов кастинга и жонглирования, +1
206

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

Если вы не можете этого сделать, приведите значение столбца к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 */
MySQL автоматически преобразует строку в число для умножения на1
@superphonic: результат будетdecimal.
и если вы смешали строку и число и хотите, чтобы они оба были отсортированы, используйте & quot; порядок по col * 1, col & quot;
Первый вариант является наиболее подходящим, второй имеет дополнительный шаг, но он работает, тем не менее.
заказ по цв * 1 работает отлично. Что за магия стоит за этим? Извините, я не профессионал, так что это может быть глупый вопрос, но как * 1 заставляет его меняться на число? Jamol
14

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

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

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

Вы можете просто использовать1 - ISNUMERIC(ID) вместо(CASE WHEN ISNUMERIC(ID) = 1 THEN 0 ELSE 1 END) изменить 0 на 1 и наоборот.
2

select * from tablename
order by cast(columnname as int) asc
можешь объяснить почему?
6

Another and simple way

ORDER BY ABS(column_name)

Похожие вопросы