【问题标题】:Sorting mixed numbers and letters [duplicate]对混合数字和字母进行排序[重复]
【发布时间】:2014-10-24 16:41:28
【问题描述】:

我正在尝试做一种高级排序... 我的字段类似于

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

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

关于如何对这样的列表进行排序有什么想法吗?

【问题讨论】:

  • 我会创建一个视图或计算列来按照您的需要分解您的字段,然后按该列组合进行排序。从您的示例中,我无法准确地告诉您您对排序的期望。
  • 我不知道这是否可行,因为这些字段不遵循任何约定
  • 一个不遵循惯例的字段或集合,对我来说,听起来不像是机器可排序的。
  • 字段第一部分(即3151222、3151部分)的排序规则是什么?
  • 也许再举一个例子。我在 List(Of String) 和 .Sort() 列表中添加了您的初始列表,并且输出与您想要的相同。根据您的示例,默认排序似乎已经完成了您想要的操作。

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


【解决方案1】:

我建议在 .Net 端实现 custom comparer。然后可能使用一些正则表达式来确定不同的连字符分隔的字段。考虑到它使用的是正则表达式,很难说性能是否好。

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

【讨论】:

  • 是的,我正在做类似的事情......但就像你说的......它相当复杂
  • 问题是它们并不总是分开的,有时我可能会得到 315122-111-11.5E 315122-111-11.5EE 或 315122-111-11.5D .. 就像我说的没有设置约定...
【解决方案2】:

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

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

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

如何使用简单的前 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”而不是“1、11、12、2、21、22” , 23, 3, 32, 33, 4, 41, 42",那么你最终不得不做一个填充和子串技巧。只是使声明更复杂一些,但并非不可能。如果您不关心您的数字列是否按算术排序,只关心它的排序(即字符串排序),那么您可以将其保留为简单字符串。

对日期(日期时间、小日期时间等)进行排序需要您将日期转换为字符串,并指定对您的需求有意义的转换类型。

非定点数字(浮点数)可能需要您格式化/转换为您认为适合您需要的最大宽度。

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

正如我所说,我在客户端的 C# 代码中完成了这一切,但如果您需要帮助将选择语句转换为创建视图语句,我可以抓取创建视图的示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 2023-03-30
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多