基於正則表達式的解決方案更加優雅。但是,假設您想首先使用數字排序對數字組件進行排序,然後使用字符排序對字符組件進行排序,則還可以使用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.
爲什麼會在112和232之間?不應該在10到100之間排序嗎? –
這可能是一個錯字,因爲OP很好地描述了這個問題... –
@Justin Cave:顯示的數據列表('112,20,20D')是OP ***從niaive字母數字排序中得到的***。 OP ***想要什麼***是你想要的('20,112,200D') – MatBailie