c# - 将 'numerical' 排序应用于具有多个小数点/句点的奇数数据结构

标签 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..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

我已经尝试用 LPAD(LINE_NUMBER, 9, '0') 填充条目,但由于句号加倍,我仍然得到一个不稳定的排序。 See this SO question .

我试过 REGEXP_REPLACE(LINE_NUMBER, '..', '') 来完全删除双句号,但这也不起作用。我认为这可能是 Oracle 的答案所在,但我是一个完全的 Oracle 菜鸟,尽管我相当精通 MySQL/MariaDB 和 MS SQL。

我也尝试过 REGEXP_SUBSTR as shown in this site ,但我无法使他的示例对我有用。

我还尝试了 this SO question 中显示的技术,但虽然它处理多个小数点,但它不处理彼此相邻的倍数。

我想如果我可以简单地删除双句号(或者可能只是删除第一个句号之后的所有尾随句号?),我可以获得正确的排序。我可以简单地选择同一列数据的另一个副本,删除双句点和 ORDER BY 该列而不是 GridView 中的 LINE_NUMBER。双小数点并不重要,如果它们被删除,字符串就变成了一个 float ,我可以按数字排序(我认为)。

除非有一种相对简单的基于 Oracle 的方法来执行此操作,否则我可能会在后面的代码中操作数据表以拆分双句点上的字符串并弄清楚如何在那里应用排序。

正如我之前所说,我无法控制 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

第一个数字是包裹的“发货套装”,第二个数字是发货套装中的套件,两位小数后的第三个数字(如果存在)是 Material list 中的行项目。根据我的用户的说法,任何超过两位数的可能性很小,但并非不可能

最佳答案

尝试:

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
;

演示:http://sqlfiddle.com/#!4/1786b/11

| 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 |

关于c# - 将 'numerical' 排序应用于具有多个小数点/句点的奇数数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45443062/

相关文章:

performance - 具有高缓冲区获取和高索引争用的插入语句

oracle - Oracle 数据库中所有表中数字列的最大范围和最大值

c# - C#中的加密

c# - NuGet 不更新我的项目中的 dll 引用

c# - ria 服务服务器端数据结构 : is it shared between threads

c# - 通过 gsm 调制解调器在 asp.net 中发送短信

c# - 如何使用 OracleClientFactory 将超过 4000 个字符插入到 XmlType 中?

c# - 什么是应用域?

c# - 从字节数组加载时找不到 AppDomain 程序集

c# - 请求越多意味着从缓存对象中读取的速度越慢?