Строку SQL того, как количество


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

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

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

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

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

1 10 2 3 4 5 6 7 8 9

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

10 99

10 ответов:

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

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

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

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

select col from yourtable
order by col + 0

BTW 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 
'3'        |  0   /* the left side of the string does not start with a number */

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

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

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

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

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

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

надеюсь, что это помогает

еще один и простой способ

ORDER BY ABS(column_name)

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

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

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

или приказ по части поля что-то вроде 'tensymbols13', 'tensymbols1222' и т. д.

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

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

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

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

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

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

Так что результат будет Сто двадцать три миллиона четыреста пятьдесят шесть тысяч семьсот восемьдесят девять Сто двадцать три миллиона четыреста пятьдесят шесть тысяч семьсот восемьдесят восемь Сто двадцать три миллиона четыреста пятьдесят шесть тысяч семьсот восемьдесят семь ... Сто Девяносто девять ... Два 1

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

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

на MySQL вы можете использовать это:

SELECT your_column 
FROM your_table
ORDER BY LENGTH(your_column) ASC, your_column ASC

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

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

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