строка сортировки mysql с размерами и кавычками

#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