Конвертировать текст в число в запросе MySQL - PullRequest
117 голосов
/ 11 мая 2011

Возможно ли преобразовать текст в число в запросе 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.Если имя не будет содержать цифр, будет ли сохранено использование этого решения?

Ответы [ 9 ]

232 голосов
/ 11 мая 2011

Это должно работать:

SELECT field,CONVERT(SUBSTRING_INDEX(field,'-',-1),UNSIGNED INTEGER) AS num
FROM table
ORDER BY num;
29 голосов
/ 11 мая 2011

Вы можете использовать SUBSTRING и CONVERT:

SELECT stuff
FROM table
WHERE conditions
ORDER BY CONVERT(SUBSTRING(name_column, 6), SIGNED INTEGER);

Где name_column - столбец со значениями «name-». SUBSTRING удаляет все до шестого символа (то есть префикса "name-"), а затем CONVERT преобразует левое в реальное целое число.

ОБНОВЛЕНИЕ : Учитывая изменяющиеся обстоятельства в комментариях (то есть префикс может быть любым), вам придется добавить LOCATE в миксе:

ORDER BY CONVERT(SUBSTRING(name_column, LOCATE('-', name_column) + 1), SIGNED INTEGER);

Это, конечно, предполагает, что в нечисловом префиксе нет дефисов, но в соответствующем комментарии говорится, что:

name может быть любой последовательностью букв

так что это должно быть безопасное предположение.

14 голосов
/ 11 мая 2011

Вы можете использовать CAST () для преобразования строки в int. например SELECT CAST('123' AS INTEGER);

13 голосов
/ 16 ноября 2016

Просто используйте CAST,

CAST(column_name AS UNSIGNED)

Тип результата преобразования может быть одним из следующих значений:

BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL[(M[,D])]
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]
10 голосов
/ 11 мая 2011
SELECT *, CAST(SUBSTRING_INDEX(field, '-', -1) AS UNSIGNED) as num FROM tableName ORDER BY num;
2 голосов
/ 15 июля 2013

, если ваш первичный ключ - это строка в формате, подобном

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
2 голосов
/ 11 мая 2011

Чтобы получить число, попробуйте с помощью SUBSTRING_INDEX(field, '-', 1) затем конвертировать.

0 голосов
/ 13 апреля 2017

Общий способ сделать:

SELECT * FROM your_table ORDER BY LENTH(your_column) ASC, your_column ASC
0 голосов
/ 04 июля 2016

один простой способ ВЫБРАТЬ '123' + 0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...