gpt4 book ai didi

sql - 从Oracle对记录进行排序,带有多个小数点(.)

转载 作者:行者123 更新时间:2023-12-04 06:38:38 25 4
gpt4 key购买 nike

UPDATE:

ORACLE VERSION 10G



我在 Oracle中有一个记录列表,如下所示,这些实际上是各本书的各个部分
记录以以下格式生成

[主要主题]。[子主题]。[第一级部分] ...... [最后一级部分]
Sections
--------
1
7.1
6.2
7.1
7.4
6.8.3
6.8.2
10
1.1
7.6
6.1
11
8.3
8.5
1.1.2
6.4
6.6
8.4
1.1.6
6.8.1
7.7.1
7.5
7.3

我想像这样订购
 1
1.1
1.1.2
1.1.6
6.2
6.4
6.5
6.6
6.7
6.8.1
6.8.2
6.8.3
7.2
7.3
7.4
7.5
7.6
7.7.1
7.7.2
8.3
8.4
8.5
10

但是由于该字段不是 numeric datatype,因此排序结果如下
1
10
1.1
1.1.2
1.1.6
....
.....
8.5

我该如何对它们进行排序。由于多个小数点,我无法将它们转换为数字。
oracle中是否有任何支持这种排序技术的功能

最佳答案

知道最大深度后,可以将该部分分为几个小节:

SQL> SELECT SECTION FROM DATA
2 ORDER BY to_number(regexp_substr(SECTION, '[^.]+', 1, 1)) NULLS FIRST,
3 to_number(regexp_substr(SECTION, '[^.]+', 1, 2)) NULLS FIRST,
4 to_number(regexp_substr(SECTION, '[^.]+', 1, 3)) NULLS FIRST;

SECTION
-------
1
1.1
1.1.2
1.1.6
6.1
6.2
[...]
8.5
10
11

如果子节的最大深度是未知的(但在8位字符数据库中大概不到几百个,在ANSI字符数据库中大概不到几千个),则可以定义一个函数,将无法排序的数字转换为可排序的字符:
SQL> CREATE OR REPLACE FUNCTION order_section (p_section VARCHAR2)
2 RETURN VARCHAR2 IS
3 l_result VARCHAR2(4000);
4 BEGIN
5 FOR i IN 1..regexp_count(p_section, '[^.]+') LOOP
6 l_result := l_result
7 || CASE WHEN i > 1 THEN '.' END
8 || CHR(64+regexp_substr(p_section, '[^.]+', 1, i));
9 END LOOP;
10 RETURN l_result;
11 END;
12 /

Function created

SQL> SELECT SECTION, order_section(SECTION)
2 FROM DATA
3 ORDER BY 2;

SECTION ORDER_SECTION(SECTION)
------- -------------------------
1 A
1.1 A.A
1.1.2 A.A.B
1.1.6 A.A.F
6.1 F.A
6.2 F.B
[...]
8.5 H.E
10 J
11 K

关于sql - 从Oracle对记录进行排序,带有多个小数点(.),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21020116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com