Строка заказа 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 - это вариант, но он маскирует вашу плохую схему, которая должна быть исправлена.