2011-08-03 4 views
0

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

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

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

ответ

2

Через чистый 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 вам нужно использовать user-defined function.

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

+0

У нас была аналогичная проблема, и хранение и сортировка по отдельному нормализованному столбцу «имя лота» - это путь. Сделайте столбец сортировки длиннее, чем исходный столбец, тем не менее добавляя нулевые нули. –

+0

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