Можно ли преобразовать текст в число в запросе MySQL? У меня есть столбец с идентификатором, который содержит имя и номер в формате "имя-номер". Столбец имеет тип VARCHAR. Я хочу сортировать строки по числу (строки с тем же именем), но столбец сортируется в соответствии с порядком символа, т.е.
name-1
name-11
name-12
name-2
Если я сокращаю число, могу ли я преобразовать число "varchar" в "реальный" номер и использовать его для сортировки строк? Я хотел бы получить следующий заказ.
name-1
name-2
name-11
name-12
Я не могу представить число как отдельный столбец.
отредактировано 2011-05-11 9:32
Я нашел следующее решение ... ORDER BY column * 1
. Если имя не будет содержать каких-либо номеров, сохранит ли это решение?
Ответ 1
Это должно работать:
SELECT field,CONVERT(SUBSTRING_INDEX(field,'-',-1),UNSIGNED INTEGER) AS num
FROM table
ORDER BY num;
Ответ 2
Вы можете использовать SUBSTRING
и CONVERT
:
SELECT stuff
FROM table
WHERE conditions
ORDER BY CONVERT(SUBSTRING(name_column, 6), SIGNED INTEGER);
Где name_column
- столбец со значениями "name-". SUBSTRING
удаляет все до шестого символа (т.е. Префикс "имя-префикс" ), а затем CONVERT
преобразует значение слева в действительное целое число.
ОБНОВЛЕНИЕ. Учитывая изменяющиеся обстоятельства в комментариях (т.е. префикс может быть любым), вам придется выбросить LOCATE
в миксе:
ORDER BY CONVERT(SUBSTRING(name_column, LOCATE('-', name_column) + 1), SIGNED INTEGER);
Это, конечно, предполагает, что нечисловой префикс не имеет в нем дефис, но соответствующий комментарий говорит, что:
name
может быть любая последовательность букв
чтобы это было безопасное предположение.
Ответ 3
Вы можете использовать CAST() для преобразования из строки в int. например SELECT CAST('123' AS INTEGER);
Ответ 4
SELECT *, CAST(SUBSTRING_INDEX(field, '-', -1) AS UNSIGNED) as num FROM tableName ORDER BY num;
Ответ 5
Чтобы получить номер, попробуйте с SUBSTRING_INDEX(field, '-', 1)
, затем конвертируйте.
Ответ 6
если ваш первичный ключ является строкой в формате, таком как
ABC/EFG/EE/13/123 (порядковый номер)
эта строка может быть легко использована для сортировки с разделителем ( "/" )
мы можем использовать следующий запрос для заказа таблицы с этим типом ключа
SELECT * FROM `TABLE_NAME` ORDER BY
CONVERT(REVERSE(SUBSTRING(REVERSE(`key_column_name`), 1, LOCATE('/', REVERSE(`key_column_name`)) - 1)) , UNSIGNED INTEGER) DESC
Ответ 7
Просто используйте CAST,
CAST(column_name AS UNSIGNED)
Тип результата каста может быть одним из следующих значений:
BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL[(M[,D])]
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]
Ответ 8
Общий способ:
SELECT * FROM your_table ORDER BY LENTH(your_column) ASC, your_column ASC
Ответ 9
один простой способ SELECT '123' + 0