У нас есть большая база данных, на которой у нас есть разбиение на части БД. Это быстро, возвращая страницу из 50 строк из миллионов записей за небольшую долю секунды.Естественная (человеческая альфа-цифровая) сортировка в Microsoft SQL 2005
Пользователи могут определять свой собственный вид, в основном, выбирать, какой столбец сортировать. Столбцы являются динамическими - некоторые из них имеют числовые значения, некоторые даты и некоторый текст.
В то время как большинство типов, как ожидалось, текст сортируется глухим способом. Ну, я говорю глупо, это имеет смысл для компьютеров, но расстраивает пользователей.
Например, сортировка по струнной Индентификационный дает что-то вроде:
rec1
rec10
rec14
rec2
rec20
rec3
rec4
... и так далее.
Я хочу, чтобы это принять во внимание числа, так:
rec1
rec2
rec3
rec4
rec10
rec14
rec20
Я не могу контролировать вход (в противном случае я бы просто формат в ведущих 000s), и я не могу полагаться на один формат - некоторые из них похожи на «{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 - ваш ответ может работать, но он чувствует себя уродливым компромиссом, чтобы добавить ключ сортировки для всех этих текстовых значений.
Этот вопрос своего рода старый, но я добавил решение CLR на основе, что я придумал, что может помочь кому-то еще ... – RedFilter 2010-01-14 13:28:33
Существует а [Coding Horror статья] (HTTP : //www.codinghorror.com/blog/archives/001018.html) относительно натурального сорта. Из комментариев кажется, что эта функция недоступна в SQL Server. – 2008-08-29 16:40:02
Хотя ответ @ RedFilter, а также улучшение ответа Римана Старкова на RedFilter, оба хороши, оптимальным решением для SQL Server было бы это внутренне обработать через свойство Collation. Это уже возможно в ОС, поскольку оно используется в Проводнике при сортировке файлов по имени (например, с Windows 7). Прошу проголосовать за предложение по подключению к Microsoft, чтобы эта функция была встроена в SQL Server, так что, надеюсь, на самом деле это произойдет: https://connect.microsoft.com/SQLServer/feedback/details/2932336/support-natural-sorting-digitsasnumbers-as -a-collation-option – 2017-04-25 15:09:48