Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Menyortir catatan dari Oracle dengan beberapa titik desimal (.)

Ketika kedalaman maksimum diketahui, Anda dapat membagi bagian menjadi sub-bagian:

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

Jika kedalaman maksimum sub-bagian tidak diketahui (tetapi mungkin kurang dari beberapa ratus pada basis data karakter 8-bit atau kurang dari beberapa ribu dalam basis data karakter ANSI), Anda dapat menentukan fungsi yang mengubah digit yang tidak dapat diurutkan menjadi karakter yang dapat diurutkan :

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. Berurusan dengan data JSON besar yang dikembalikan oleh Web API

  2. Bagaimana cara menggunakan Oracle ORDER BY dan ROWNUM dengan benar?

  3. Dalam database Oracle, apa perbedaan antara ROWNUM dan ROW_NUMBER?

  4. Output yang diinginkan dengan data tabel yang diberikan

  5. Kembali dari Open World 2013