Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Sortowanie rekordów z Oracle z wieloma miejscami dziesiętnymi (.)

Gdy znana jest maksymalna głębokość, możesz podzielić sekcję na podsekcje:

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

Jeśli maksymalna głębokość podsekcji jest nieznana (ale prawdopodobnie mniej niż kilkaset w 8-bitowych bazach danych znaków lub mniej niż kilka tysięcy w bazach znaków ANSI), możesz zdefiniować funkcję, która konwertuje niesortowalne cyfry na znaki, które można sortować :

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. Wysyłanie tablicy wartości do procedury Oracle do użycia w klauzuli WHERE IN

  2. Oracle — jak uzyskać rzeczywisty rozmiar konkretnego wiersza?

  3. Jak mogę uniemożliwić Oracle SQL Developer zamknięcie połączenia z bazą danych?

  4. EF 4, jak dodać częściowe klasy

  5. Czy zagnieżdżone bloki mają jakikolwiek wpływ na wydajność w procedurach PL/SQL?