中的Oracle SQL結果這是我的Oracle SQL命令看起來像:如何有一個數字順序
select domain
from table1
order by 1 desc
,這裏是返回的數據的實際順序,
us9.aaa.com
us8.aaa.com
us10.aaa.com
us1.aaa.com
我的問題是:如何修改這個SQL,數據按這個順序返回:
us10.aaa.com
us9.aaa.com
us8.aaa.com
us1.aaa.com
中的Oracle SQL結果這是我的Oracle SQL命令看起來像:如何有一個數字順序
select domain
from table1
order by 1 desc
,這裏是返回的數據的實際順序,
us9.aaa.com
us8.aaa.com
us10.aaa.com
us1.aaa.com
我的問題是:如何修改這個SQL,數據按這個順序返回:
us10.aaa.com
us9.aaa.com
us8.aaa.com
us1.aaa.com
將alpha和數字混合到orde中環是困難的,但是如果格式是固定的,可以通過分解組件來實現。在你的情況你可以,例如:
with dat as (select 'us9.aaa.com' addr from dual union all
select 'us8.aaa.com' addr from dual union all
select 'us10.aaa.com' addr from dual union all
select 'us1.aaa.com' addr from dual)
select addr from dat
order by to_number(substr(addr,3,instr(addr,'.')-3)) desc
返回:
ADDR
"us10.aaa.com"
"us9.aaa.com"
"us8.aaa.com"
"us1.aaa.com"
下面是使用REGEXP_REPLACE的方式()。它不關心有多少非數字字符是要排序的(也不關心數字部分是多麼大)域名的數字部分之前:
SQL> with table1(domain) as (
select 'us9.aaa.com' from dual
union
select 'us8.aaa.com' from dual
union
select 'us10.aaa.com' from dual
union
select 'us1.aaa.com' from dual
)
select domain
from table1
order by to_number(regexp_replace(domain, '^\D+(\d+)\..*', '\1')) desc;
DOMAIN
------------
us10.aaa.com
us9.aaa.com
us8.aaa.com
us1.aaa.com
SQL>
正則表達式可以讀as「在字符串的開頭尋找一個或多個非數字字符,後跟一個記憶的一個或多個數字組,後跟一個文字週期,後跟任意數量的任何字符(直到字符串結尾爲默示)」。 '\ 1'表示返回第一個記憶組,它是數字,它被轉換爲ORDER BY工作的數字。