我们有一个大型数据库,在该数据库上进行 DB 端分页。这很快,在几分之一秒内从数百万条记录中返回一页 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 - 您的答案可能有效,但为所有这些文本值添加排序键确实是一种丑陋的妥协。