Преобразование текста в число в запросе MySQL

Можно ли преобразовать текст в число в запросе 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