Вопрос по string, sql, numbers, mysql, sql-order-by – Строка заказа SQL как число
У меня есть номера, сохраненные какVARCHAR
в базу данных MySQL. Я не могу их сделатьINT
из-за некоторых других зависимых обстоятельств.
При сортировке они воспринимаются как символы, а не как числа.
В базе данных у меня есть
1 2 3 4 5 6 7 8 9 10...
На моей странице он показывает упорядоченный список следующим образом:
1 10 2 3 4 5 6 7 8 9
Как я могу сделать так, чтобы они казались упорядоченными по номерам по возрастанию?
Если у вас есть строковое поле, вы можете преобразовать его или его числовую часть следующим образом: добавьте начальные нули, чтобы все целые строки имели одинаковую длину.
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
вам следует изменить тип данных столбца на число, если вы все равно сохраняете числа.
Если вы не можете этого сделать, приведите значение столбца к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 */
с которым я сортирую, имеет любую комбинацию букв и цифр, поэтому я использовал предложения в этом посте в качестве отправной точки и придумал это.
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
Надеюсь это поможет