对混合数字和字母进行排序

时间:2014-10-24 16:41:29

标签: c# asp.net sql-server sorting natural-sort

我想尝试做类似高级的... 我的字段类似于

315122-111-7.5
315122-111-8
315122-001-7.5
315122-111-8.5
315122-001-8
315122-001-9
3151-BLK-7
3151-BLK-7.5
3151-BLK-9

我正试图找到一种方法对它们进行排序

315122-001-7.5
315122-001-8
315122-001-9
315122-111-7.5
315122-111-8
315122-111-8.5
3151-BLK-7
3151-BLK-7.5
3151-BLK-9

基本上我希望按可读数字和字母排序......

关于如何对这样的清单进行排序的任何想法?

2 个答案:

答案 0 :(得分:0)

我建议在.Net方面实施custom comparer。然后可能使用一些正则表达式来确定不同的连字符分隔字段。鉴于它正在使用Regex,很难说性能是否会很好。

我不知道如何在sql server中执行这种复杂的排序。

答案 1 :(得分:0)

您想要创建一个新字段,该字段是您要排序的字段的合并。然后你对合并的领域进行排序,给你你想要的东西。

您实际上不必在源表中创建一个字段来执行此操作。您可以创建一个视图,并让视图创建新的"排序"列,通过选择字段并将它们一起添加到导航/排序列名称下。

我从代码中做了一些非常相似的事情来创建一个独特的导航栏。

如何使用简单的前100选择创建此唯一排序列的示例:

SELECT TOP 100 
[ Column1ToBeSorted ], 
[ Column2ToBeSorted ], 
[ Column3 ], 
[ Column4 ], 
[ Column5 ],
( [ Column1ToBeSorted ] + '-' + [ Column2ToBeSorted] ) AS "NavigationKey" 
FROM [dbo].[ SourceTable ] 
ORDER BY [NavigationKey] ASC

您可以根据需要添加任意数量的列。你只需要保持一致。

像varchar和nvarchar这样的简单字符字段很容易以这种方式使用。

对数字字段进行排序可能有点棘手。如果您希望该列排序为" 1,2,3,4,11,12,21,22,23,32,33,41,42和#34;而不是" 1,11,12,2,21,22,23,3,32,33,4,41,42和#34;然后你最终必须做一个填充和子串技巧。只是使声明更复杂,但并非不可能。如果您不关心数字列是否按算术排序,只是它的排序(即字符串排序),那么您可以将其保留为简单的字符串。

排序日期(datetime,smalldatetime等)要求您将日期转换为字符串,并指定符合您需求的转换类型。

非定点数值(浮点数)可能需要您格式化/投射到您认为适合您需要的最大宽度。

由于已排序的" NavigationKey"它会使查询变慢。正在建造的列。请记住,每当添加,删除行或选择用于排序参与更改的列时,服务器都必须重建它。这就是为什么我建议你创建一个视图---因为如果你不需要它,你可以跳过编译的导航列。

正如我所说,我是从客户端的C#代码中完成的,但是如果需要帮助将select语句转换为create view语句,我可以抓一个创建视图的示例。