Естественная сортировка по данным, смешивающим текст и числа (а затем больше текста * иногда *) - PullRequest
0 голосов
/ 03 августа 2011

Я работаю над сайтом для парня, который проводит аукционы скота.Он введет животных как лот 1, лот 2, лот 3, лот 3а, лот 4, ... лот 100, ... лот N. Так как это смесь чисел и текста, я сначала упорядочил по длине (LotName), LotName. * Это работало до тех пор, пока я не ввел животное «add on» (указанное в конце «a»).

Можно ли как-нибудь получить данные для сортировки прямо через SQL?

* Нашел на этом сайте, спасибо!

1 Ответ

2 голосов
/ 03 августа 2011

через чистый SQL? Не просто!

Мы сделали это в коде моего проекта, и, в основном, вы применяете регулярное выражение, которое соответствует серии цифр или не цифр (что-то вроде ([0-9]+)|([^0-9]+)), превращает строку в кортеж таких серий, преобразует серии цифр в целые числа, затем сортирует кортежи с парным сравнением. Например:

"Lot 1"   -> ("Lot ", 1)
"Lot 2"   -> ("Lot ", 2)
"Lot 3"   -> ("Lot ", 3)
"Lot 3a"  -> ("Lot ", 3, "a")
"Lot 100" -> ("Lot ", 100)

Тогда при парном сравнении (а) сортируются целые числа перед строками, (б) сортируются целые числа в естественном порядке и (в) сортируются строки в естественном порядке.

Если бы вы могли применять регулярные выражения к столбцам для сортировки, вы могли бы использовать одно, чтобы «нормализовать» числа в строки цифр фиксированной длины, дополненные нулями. Как это:

"Lot 1"   -> "Lot 0001"
"Lot 2"   -> "Lot 0002"
"Lot 3"   -> "Lot 0003"
"Lot 3a"  -> "Lot 0003a"
"Lot 100" -> "Lot 0100"

Который должен правильно сортироваться. Однако, хотя вы можете сделать это в Oracle и некоторых других базах данных, в MySQL вам необходимо использовать пользовательскую функцию .

Однако вы можете сделать это вне базы данных. Добавьте столбец в таблицу лотов для хранения нормализованного имени лота, и всякий раз, когда вы вставляете строку из своего кода, генерируйте нормализованную форму и сохраняйте ее. Затем вы можете отсортировать, используя этот столбец.

...