首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用多个小数点对Oracle中的记录进行排序(.)

用多个小数点对Oracle中的记录进行排序(.)
EN

Stack Overflow用户
提问于 2014-01-09 12:21:59
回答 5查看 3.9K关注 0票数 9

更新: 甲骨文10G版

我在Oracle中有一个记录列表,如下所示,这些实际上是各种书籍的部分

这些记录以以下格式生成

主topic.sub topic.first电平段..last级区段

代码语言:javascript
运行
复制
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

我想按如下方式下订单

代码语言:javascript
运行
复制
 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,所以排序结果如下所示

代码语言:javascript
运行
复制
1
10
1.1
1.1.2
1.1.6
....
.....
8.5

我该怎么分类呢。由于小数点的多个数字,我无法将它们转换为数字。

oracle中是否有支持这种排序技术的函数?

EN

回答 5

Stack Overflow用户

发布于 2014-01-09 12:39:35

当已知最大深度时,可以将该区段拆分为子部分:

代码语言:javascript
运行
复制
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字符数据库中不足几千个),则可以定义一个函数,将不可排序的数字转换为可排序字符:

代码语言:javascript
运行
复制
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
票数 7
EN

Stack Overflow用户

发布于 2014-01-09 12:37:59

如果级别数是固定的(例如,最大值)。4)你可以用这个:

代码语言:javascript
运行
复制
ORDER BY 
    TO_NUMBER(REGEXP_SUBSTR(Sections, '\d+', 1, 1)) NULLS FIRST, 
    TO_NUMBER(REGEXP_SUBSTR(Sections, '\d+', 1, 2)) NULLS FIRST, 
    TO_NUMBER(REGEXP_SUBSTR(Sections, '\d+', 1, 3)) NULLS FIRST, 
    TO_NUMBER(REGEXP_SUBSTR(Sections, '\d+', 1, 4)) NULLS FIRST
票数 2
EN

Stack Overflow用户

发布于 2014-01-09 12:52:15

下面是我在一般情况下得到的解决方案(在不知道点数的情况下)--保留第一个点,用零替换所有其他点,因此您将只有一个浮点数,您可以通过以下方式应用顺序:

代码语言:javascript
运行
复制
SELECT SECTIONS FROM T_TABLE
ORDER BY TO_NUMBER(SUBSTR(SECTIONS,0,DECODE(INSTR(SECTIONS,'.'),0,LENGTH(SECTIONS)+1,INSTR(SECTIONS,'.'))) ||
REPLACE(SUBSTR(SECTIONS,DECODE(INSTR(SECTIONS,'.'),0,LENGTH(SECTIONS)+1,INSTR(SECTIONS,'.'))),'.','0'))

它可以用常规的注释来重写,但是我并不很熟悉它们,所以只使用基本的Oracle函数:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21020116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档