我们有一个庞大的数据库,采用了数据库端分页技术。这种技术快速返回了50行页面数据,即使是从数百万条记录中获取,也只需要极短的时间。
用户可以定义他们自己的排序方式,基本上是选择希望以哪一列进行排序。这些列是动态的——有些列具有数字值,有些列具有日期,有些列具有文本。
尽管大多数排序都按预期效果排序,但文本排序的结果非常不如人意。我说它很不靠谱,虽然对于计算机来说是合理的,但会让用户感到沮丧。
例如,按字符串记录 ID 排序会得到类似以下内容的结果:
rec1
rec10
rec14
rec2
rec20
rec3
rec4
...等等。
我希望这能考虑到数字,所以:
rec1
rec2
rec3
rec4
rec10
rec14
rec20
我无法控制输入(否则我会只格式化前导000),也不能依赖于单一的格式 - 有些格式是像“{alpha code}-{dept code}-{rec id}”这样的东西。
我知道在C#中有几种方法可以做到这一点,但不能拉下所有记录来排序,因为那样太慢了。
有人知道如何在Sql server中快速应用自然排序吗?
我们正在使用:
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 - 你的答案可能有效,但它看起来像是一个丑陋的妥协,需要为所有这些文本值添加排序键。