Решения на основе регулярных выражений более элегантны. Но если вы хотите сначала отсортировать числовой компонент, используя числовую сортировку, а затем отсортировать символьный компонент, используя сортировку символов, вы также можете использовать функцию TRANSLATE
.
SQL> ed
Wrote file afiedt.buf
1 with x as (
2 select '10' addr from dual union all
3 select '100' from dual union all
4 select '100A' from dual union all
5 select '1050' from dual union all
6 select '110' from dual union all
7 select '200D' from dual union all
8 select '20' from dual
9 )
10 select addr,
11 to_number( translate( addr,
12 '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ',
13 '1234567890' ) ) addr_num,
14 translate( addr,
15 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890',
16 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') addr_str
17 from x
18 order by to_number( translate( addr,
19 '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ',
20 '1234567890' ) ),
21 translate( addr,
22 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890',
23* 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')
SQL> /
ADDR ADDR_NUM ADDR_STR
---- ---------- ----------------
10 10
20 20
100A 100 A
100 100
110 110
200D 200 D
1050 1050
7 rows selected.