更新: 甲骨文10G版
我在Oracle中有一个记录列表,如下所示,这些实际上是各种书籍的部分
这些记录以以下格式生成
主topic.sub topic.first电平段..last级区段
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中是否有支持这种排序技术的函数?
发布于 2014-01-09 12:39:35
当已知最大深度时,可以将该区段拆分为子部分:
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发布于 2014-01-09 12:37:59
如果级别数是固定的(例如,最大值)。4)你可以用这个:
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发布于 2014-01-09 12:52:15
下面是我在一般情况下得到的解决方案(在不知道点数的情况下)--保留第一个点,用零替换所有其他点,因此您将只有一个浮点数,您可以通过以下方式应用顺序:
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函数:)
https://stackoverflow.com/questions/21020116
复制相似问题