我想尝试做类似高级的... 我的字段类似于
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
基本上我希望按可读数字和字母排序......
关于如何对这样的清单进行排序的任何想法?
答案 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语句,我可以抓一个创建视图的示例。