我们需要对值进行报告,这些值通常是数字和字母的混合字符串,需要“自然”排序。诸如“ P7B18”或“ P12B3”之类的东西。@字符串主要是字母序列,然后是数字交替。但是,这些段的数量和每个段的长度可能会有所不同。
我们希望这些数字部分按数字顺序排序。显然,如果我直接使用来处理这些字符串值ORDER BY
,则“ P12B3”将出现在“ P7B18”之前,因为“ P1”早于“ P7”,但是我想反过来,因为“ P7”自然会在前面“ P12”。
我还希望能够进行范围比较,例如@bin < 'P13S6'
此类。我不必处理浮点数或负数;这些严格来说是我们要处理的非负整数。字符串长度和段数可能是任意的,没有固定的上限。
在我们的案例中,字符串大小写并不重要,尽管如果有一种方法可以按排序规则识别的方式执行此操作,那么其他人可能会觉得有用。所有这一切中最丑陋的部分是我希望能够在WHERE
子句中同时进行排序和范围过滤。
如果我在C#中执行此操作,那将是一个非常简单的任务:进行一些解析以将alpha与数字分离,实现IComparable,基本上就可以完成。当然,至少就我所知,SQL Server似乎没有提供任何类似的功能。
有人知道有什么好办法可以使这项工作吗?是否有一些鲜为人知的功能来创建实现IComparable的自定义CLR类型,并使它的行为符合预期?我也不反对愚蠢的XML技巧(另请参阅:列表串联),并且服务器上也提供了CLR regex匹配/提取/替换包装器功能。
编辑: 作为一个更详细的示例,我希望数据表现出这样的效果。
SELECT bin FROM bins ORDER BY bin
bin
--------------------
M7R16L
P8RF6JJ
P16B5
PR7S19
PR7S19L
S2F3
S12F0
例如,将字符串分成所有字母或所有数字的记号,并分别按字母或数字对它们进行排序,最左边的记号是最重要的排序术语。就像我提到的那样,如果实现IComparable,.NET无疑是小菜一碟,但是我不知道如何(或是否)可以在SQL Server中实现这种功能。在使用它的10年左右的时间里,这肯定不是我遇到过的事情。
P7B12
有可能成为P 07 B 12
,然后(通过ASCII)80 07 65 12
,所以80076512