У нас есть большая база данных, на которой у нас есть разбиение на части БД. Это быстро, возвращая страницу из 50 строк из миллионов записей за небольшую долю секунды.
Пользователи могут определять свой собственный вид, в основном, выбирать, какой столбец сортировать. Столбцы являются динамическими - некоторые из них имеют числовые значения, некоторые даты и некоторый текст.
В то время как большинство типов, как ожидалось, текст сортируется глупо. Ну, я говорю глупо, это имеет смысл для компьютеров, но расстраивает пользователей.
Например, сортировка по идентификатору строковой записи дает что-то вроде:
rec1
rec10
rec14
rec2
rec20
rec3
rec4
... и т.д.
Я хочу, чтобы это учитывало число, поэтому:
rec1
rec2
rec3
rec4
rec10
rec14
rec20
Я не могу управлять вводом (иначе я бы просто форматировал ведущие 000s), и я не могу полагаться на один формат - некоторые такие вещи, как "{alpha code} - {dept code} - {rec id }".
Я знаю несколько способов сделать это на С#, но не могу вытащить все записи для их сортировки, так как это должно замедляться.
Кто-нибудь знает, как быстро применить естественный вид на сервере Sql?
Мы используем:
ROW_NUMBER() over (order by {field name} asc)
И затем мы подкастываем по этому поводу.
Мы можем добавить триггеры, хотя мы бы этого не сделали. Весь их вход параметризуется и тому подобное, но я не могу изменить формат - если они помещают "rec2" и "rec10", они ожидают, что они будут возвращены именно так и в натуральном порядке.
У нас есть действующий пользовательский ввод, который следует за различными форматами для разных клиентов.
Можно пойти rec1, rec2, rec3,... rec100, rec101
В то время как другой может пойти: grp1rec1, grp1rec2,... grp20rec300, grp20rec301
Когда я говорю, что мы не можем контролировать вход, я имею в виду, что мы не можем заставить пользователей изменять эти стандарты - они имеют значение, подобное grp1rec1, и я не могу переформатировать его как grp01rec001, поскольку это изменит что-то используемое для поиска и привязки к внешним системам.
Эти форматы сильно различаются, но часто являются смесями букв и цифр.
Сортировка на С# проста - просто разделите ее на { "grp", 20, "rec", 301 }
, а затем поочередно сравните значения последовательности.
Однако могут быть миллионы записей и данные выгружены, мне нужно, чтобы сортировка выполнялась на сервере SQL.
SQL-сервер сортируется по значению, а не по сравнению - в С# я могу разделить значения для сравнения, но в SQL мне нужна некоторая логика, которая (очень быстро) получает одно значение, которое последовательно сортируется.
@moebius - ваш ответ может работать, но он чувствует себя уродливым компромиссом, чтобы добавить сортировку для всех этих текстовых значений.