Натуральная (буквенно-цифровая) сортировка в Microsoft SQL 2005

У нас есть большая база данных, в которой мы разбиваем страницы на БД. Это быстро, возвращая страницу из 50 строк из миллионов записей за небольшую долю секунды.

Пользователи могут определять свои собственные сортировки, в основном выбирая, по какому столбцу сортировать. Столбцы являются динамическими - некоторые имеют числовые значения, некоторые даты и некоторый текст.

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

Например, сортировка по идентификатору строковой записи дает что-то вроде:

rec1
rec10
rec14
rec2
rec20
rec3
rec4

...и так далее.

Я хочу, чтобы это учитывало число, поэтому:

rec1
rec2
rec3
rec4
rec10
rec14
rec20

Я не могу контролировать ввод (иначе я бы просто отформатировал первые тысячи), и я не могу полагаться на один формат - некоторые вещи, такие как "{alpha code} - {dept code} - {rec id}".

Я знаю несколько способов сделать это в C #, но не могу обработать все записи, чтобы отсортировать их, так как это может привести к замедлению.

Кто-нибудь знает способ быстрого применения естественной сортировки на сервере Sql?

Мы используем:

ROW_NUMBER() over (order by {field name} asc)

И тогда мы пейджинговали этим.

Мы можем добавить триггеры, хотя мы не будем. Все их входные данные параметризованы и тому подобное, но я не могу изменить формат - если они вставят «rec2» и «rec10», они ожидают, что они будут возвращены просто так и в естественном порядке.

У нас есть действительный пользовательский ввод, который соответствует различным форматам для разных клиентов.

Можно пойти rec1, rec2, rec3, ... rec100, rec101

В то время как другой может пойти: grp1rec1, grp1rec2, ... grp20rec300, grp20rec301

Когда я говорю, что мы не можем контролировать ввод, я имею в виду, что мы не можем заставить пользователей изменить эти стандарты - они имеют значение, например grp1rec1, и я не могу переформатировать его как grp01rec001, так как это изменило бы что-то, используемое для поиска и связь с внешними системами.

Эти форматы сильно различаются, но часто представляют собой смесь букв и цифр.

Сортировать их в C # легко - просто разбить на{ "grp", 20, "rec", 301 } а затем сравнить значения последовательности по очереди.

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

Сервер SQL сортирует по значению, а не по сравнению - в C # я могу разделить значения для сравнения, но в SQL мне нужна логика, которая (очень быстро) получает одно значение, которое последовательно сортирует.

@moebius - ваш ответ может сработать, но это выглядит как уродливый компромисс для добавления ключа сортировки для всех этих текстовых значений.

Ответы на вопрос(13)

Ваш ответ на вопрос