Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Sắp xếp các bản ghi từ Oracle với nhiều dấu thập phân (.)

Khi biết độ sâu tối đa, bạn có thể chia phần thành các phần phụ:

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

Nếu độ sâu tối đa của các phần con là không xác định (nhưng có lẽ ít hơn vài trăm trên cơ sở dữ liệu ký tự 8 bit hoặc ít hơn vài nghìn trong cơ sở dữ liệu ký tự ANSI), bạn có thể xác định một hàm chuyển đổi các chữ số không thể sắp xếp của bạn thành các ký tự có thể sắp xếp :

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. ExecuteNonQuery luôn trả về số không. Tôi có thể sử dụng giá trị 0 này vào mã của mình để xác thực không?

  2. Cách lấy hai hàng mới nhất có giá trị nhất định theo ngày trong SQL

  3. Cơ sở dữ liệu Oracle TNS Độ dài của giá trị cho 'nguồn dữ liệu' khóa vượt quá giới hạn '128' của nó

  4. Oracle - Nhập dữ liệu vào một bảng với một tên khác?

  5. Thông báo thay đổi Cơ sở dữ liệu Oracle