जब अधिकतम गहराई ज्ञात हो, तो आप अनुभाग को उप-अनुभागों में विभाजित कर सकते हैं:
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-बिट कैरेक्टर डेटाबेस पर कुछ सौ से कम या एएनएसआई-कैरेक्टर डेटाबेस में कुछ हज़ार से कम), तो आप एक फ़ंक्शन को परिभाषित कर सकते हैं जो आपके अस्थिर अंकों को सॉर्ट करने योग्य वर्णों में परिवर्तित करता है :
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