Строку 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 ответов:
если возможно, вы должны изменить тип данных столбца на число, если вы все равно храните только числа.
если вы не можете этого сделать, то приведите значение столбца к
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 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
на MySQL вы можете использовать это:
SELECT your_column FROM your_table ORDER BY LENGTH(your_column) ASC, your_column ASC
измените свое поле на INT вместо VARCHAR.
Я не могу сделать их INT из-за некоторых других зависящих обстоятельств.
затем сначала исправьте зависящие обстоятельства. В противном случае вы работаете вокруг реальных проблем. Использование приведения MySQL-это опция, но она маскирует вашу плохую схему, которая должна быть исправлена.