MySQL - поле заказа сначала в алфавитном порядке, а затем в десятичном виде - PullRequest
0 голосов
/ 25 июня 2018

В моей базе данных есть поле VARCHAR name, которое содержит как символы, так и десятичные дроби для представления номеров версий программного обеспечения. Учитывая приведенные ниже примеры данных, как я могу упорядочить результаты в правильном порядке?

name
--------------------
Version 1.7
Version 1.8
Version 1.9
Version 1.10
Version 2.2
Version 3.0
Version 3.3

Проблема, по умолчанию, заключается в том, что упорядочение результатов только по name приводит к результатампримерно так:

name
--------------------
Version 1.10
Version 1.7
Version 1.8
Version 1.9
Version 2.2
Version 3.0
Version 3.3

Об этом уже спрашивали в StackOverflow, и я прошел и проверил многие из предоставленных ответов, но безуспешно.Также трудно найти решение, которое работает для аналогичного набора результатов, а именно для комбинации буквенно-цифровых и десятичных чисел.

Я пробовал:

ORDER BY CAST(name AS INTEGER)
ORDER BY CAST(name AS DECIMAL)
ORDER BY CAST(name AS DECIMAL(4,2)
- same as above but CONVERT(name, [type])
ORDER BY ABS(name)
- some other things which have since slipped my mind :/

Замечания:

  • Поле name не всегда имеет префикс «Version».Иногда это «Устаревший» или ряд других вещей.
  • Поле name не всегда содержит десятичные номера версий.Иногда это может быть само слово.
  • Поле name может также содержать такие элементы, как Plugin Name 2 и Go2URL.
  • Проблемным элементом является «Версия 1.10».Все методы, которые я пробовал до сих пор, привели к тому, что этот элемент неуместен.

Обходной путь:

Я временно обошел эту проблемудобавив новое поле VARCHAR с именем canonicalVersion и сохранив канонический номер версии.Таким образом, 1.10.210 становится 0001.0010.0210.0000 и поэтому просто сортируется с ORDER BY canonicalVersion ASC, и все элементы теперь находятся в правильном порядке.

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

1 Ответ

0 голосов
/ 25 июня 2018

Я думаю, вы можете использовать substring_index() и некоторые манипуляции:

order by left(name, length(name) - length(substring_index(name, ' ', -1)) - 1),
         substring_index(name, ' ', -1) + 0

Это предполагает, что сами номера версий могут быть преобразованы в числа.

...