#mysql #sorting #alphanumeric
#mysql #сортировка #буквенно-цифровой
Вопрос:
Я пытаюсь отсортировать поле, в котором есть буквы, цифры и кавычки, но я не могу получить результаты по порядку. Поле (именованное имя) в таблице содержит данные, подобные этому, хотя и не упорядоченные, как показано:
6"w x 9"h
6"w x 10"h
7"w x 8"h
7"w x 9"h
7"w x 10"h
7"w x 21"h
10"w x 10"h
Команда, которую я использую
select name from my_table order by name;
Результат
10"w x 10"h
6"w x 10"h
6"w x 9"h
7"w x 10"h
7"w x 21"h
7"w x 8"h
7"w x 9"h
Я перепробовал все следующие, которые я нашел на этом сайте. Я не смог заставить последнюю работать вообще, но остальные работали немного лучше, чем приведенные выше, но все равно не корректно.
order by name * 1
order by name 0
order by CAST(name AS DECIMAL(10,2))
order by length(name), name
order by CAST(SUBSTR(name, 0, LOCATE('w', name) - 1) AS int),
CAST(SUBSTR(name FROM (LOCATE('h', name) - 1)) AS int)
Первые две альтернативы выше дали этот результат, поэтому они почти делают это.
6"w x 9"h
6"w x 10"h
7"w x 10"h
7"w x 21"h
7"w x 9"h
7"w x 8"h
10"w x 10"h
Кто-нибудь знает, как отсортировать их, чтобы они были в правильном порядке, как показано ниже.
6"w x 9"h
6"w x 10"h
7"w x 8"h
7"w x 9"h
7"w x 10"h
7"w x 21"h
10"w x 10"h
Комментарии:
1. В MySQL 8.x вы можете использовать
REGEXP_SUBSTR()
функцию для извлечения обоих значений, а затем выполнить сортировку с их помощью. Какую версию MySQL вы используете?
Ответ №1:
Последнее в правильном направлении. Вам нужно упорядочить по номеру в строке:
ORDER BY CAST(SUBSTR(name, 1, LOCATE('"w', name) - 1) AS signed),
CAST(SUBSTR(name, LOCATE('x', name) 1, LOCATE('"h', name) - LOCATE('x', name) -1) AS signed)
Ответ №2:
В MySQL 8.x вы можете использовать REGEXP_SUBSTR()
функцию для извлечения сложных выражений переменной длины:
select dimension
from (
select
dimension
cast(regexp_substr(dimension, '[0-9] ') as int) as w,
cast(substr(regexp_substr(dimension, 'x [0-9] '), 3, 10) as int) as h
from t
)
order by w, h