C# 对具有多个小数点/句点的奇数数据结构应用“数值”排序

C# 对具有多个小数点/句点的奇数数据结构应用“数值”排序,c#,asp.net,oracle,C#,Asp.net,Oracle,我有一个ASP.NET应用程序,它将数据从Oracle表拉入GridView。我完全无法控制Oracle数据,是行号指示成套设备的零件一起进入装运包,我不知道使用双小数是谁的主意 数据如下所示,小数点加倍是问题所在这是数千行数据的一个小示例: LINE_NUMBER 1.1 10.1 11.1 2.1 2.1..1 2.1..2 3.1 4.1 5.1 6.1 7.1 8.1 8.1..1 8.1..2 9.1 我需要这样订购: LINE_NUMBER 1.1 2.1 2.1..1 2.1..

我有一个ASP.NET应用程序,它将数据从Oracle表拉入GridView。我完全无法控制Oracle数据,是行号指示成套设备的零件一起进入装运包,我不知道使用双小数是谁的主意

数据如下所示,小数点加倍是问题所在这是数千行数据的一个小示例:

LINE_NUMBER
1.1
10.1
11.1
2.1
2.1..1
2.1..2
3.1
4.1
5.1
6.1
7.1
8.1
8.1..1
8.1..2
9.1
我需要这样订购:

LINE_NUMBER
1.1
2.1
2.1..1
2.1..2
3.1
4.1
5.1
6.1
7.1
8.1
8.1..1
8.1..2
9.1
10.1
11.1
我尝试用LPADLINE_编号9,'0'填充条目,但由于周期加倍,我仍然得到一个不可靠的排序

我尝试过用REGEXP\u REPLACELINE\u NUMBER“…”来完全删除双句点,但也没有效果。我认为这可能是Oracle的答案所在,但我是一个完全的Oracle noob,尽管我相当精通MySQL/MariaDB&MS SQL

我也尝试过REGEXP\u SUBSTR,但我无法让他的示例对我起作用

我还尝试了中所示的技术,但虽然它处理多个小数点,但它不能处理相邻的多个小数点

我想如果我可以简单地去掉双周期,或者在第一个周期之后去掉所有的尾随周期,我就能得到正确的排序。我可以简单地选择同一列数据的另一个副本,删除双句点并按该列排序,而不是按GridView中的行数排序。双小数点其实并不重要,如果去掉它们,字符串就会变成一个浮点数,我想我可以对它进行数字排序

除非有一种相对简单的基于Oracle的方法来实现这一点,否则我可能会在后面的代码中操作datatable,以在双句点上拆分字符串,并找出如何在那里应用排序

如前所述,我无法控制Oracle数据,只能查询,不能写入数据库

为了回答问题,这里列出了可能的字符串。请注意,这并不是详尽无遗的,只是一些可能的例子。任何数字都有可能达到三位数,但可能性很小:

9.1
41.1
1.1..1
1.1..15
10.1..1
15.1..3
2.1..1
2.1..10
2.1..2
21.1..1
23.1..10
23.1..2
3.1..1
30.1..1
31.1..1
4.1..1
9.1..10
9.1..2
可能的例子,但不太可能:

123.345..678
第一个数字是包装的装运组,第二个数字是装运组中的套件,第三个数字在双小数后(如果存在)是物料清单中的行项目。根据我的用户,他们中任何一个超过两位数的可能性都很小,但并非不可能。

试试:

SELECT LINE_NUMBER,
       LINE_NUM
FROM (
  SELECT LINE_NUMBER,
         replace( Line_number, '..', '.' ) As Line_num
  FROM table1
) 
ORDER BY
       to_number(regexp_substr( Line_num, '\d+', 1, 1)) NULLS FIRST,
       to_number(regexp_substr( Line_num, '\d+', 1, 2)) NULLS FIRST,
       to_number(regexp_substr( Line_num, '\d+', 1, 3)) NULLS FIRST,
       to_number(regexp_substr( Line_num, '\d+', 1, 4)) NULLS FIRST
;
演示:

尝试:

演示:



第一个圆点和最终的双圆点之间的第二部分可以包含10吗?还是总是1?还有其他问题,它是唯一可能的格式吗?或1.2..3.4也可以找到?请参阅问题底部解决问题的其他信息。第二个问题中的格式不存在。good@krokodilko的答案很好,那么第一个点和最终的双点之间的第二部分是否可以包含10或始终为1?以及其他问题,这是唯一可能的格式吗?或1.2..3.4也可以找到?请参阅问题底部解决问题的其他信息。第二个问题中的格式不存在。good@krokodilko的答案很好,那么在他想要的解决方案中,10.1必须在9.1之后;好:如果他只有一个级别:不知道他是否可以在之后有更多,或者他给出的示例是否在格式方面详尽无遗请参阅OP中关于格式的更新,我想我已经回答了你的问题。如果你们需要更多的信息,请告诉我,谢谢你们的帮助。@delliottg根据你们的解释,这就像一个符咒。你甚至可以删除第四个顺序,这需要一些调整,因为我的实际查询要复杂得多,但我现在已经把它正确地排序了,非常感谢!10.1在其所需溶液中必须在9.1之后;好:如果他只有一个级别:不知道他是否可以在之后有更多,或者他给出的示例是否在格式方面详尽无遗请参阅OP中关于格式的更新,我想我已经回答了你的问题。如果你们需要更多的信息,请告诉我,谢谢你们的帮助。@delliottg根据你们的解释,这就像一个符咒。你甚至可以删除第四个顺序,这需要一些调整,因为我的实际查询要复杂得多,但我现在已经把它正确地排序了,非常感谢!
| LINE_NUMBER | LINE_NUM |
|-------------|----------|
|           1 |        1 |
|         1.1 |      1.1 |
|         2.1 |      2.1 |
|      2.1..1 |    2.1.1 |
|      2.1..2 |    2.1.2 |
|         3.1 |      3.1 |
|         4.1 |      4.1 |
|         5.1 |      5.1 |
|         6.1 |      6.1 |
|         7.1 |      7.1 |
|         8.1 |      8.1 |
|      8.1..1 |    8.1.1 |
|      8.1..2 |    8.1.2 |
|         9.1 |      9.1 |
|        10.1 |     10.1 |
|        11.1 |     11.1 |