Oracle
 sql >> база данни >  >> RDS >> Oracle

Сортиране на записи от 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Четене на BLOB с помощта на JDBC Spring без набор от резултати

  2. Събитие на изчакване:преоразмеряване на асинхронния дескриптор

  3. Функция SYSDATE в Oracle

  4. Oracle REF не може да премине

  5. Грешка- ORA-22835:Буферът е твърде малък за преобразуване на CLOB в CHAR или BLOB в RAW