2015-11-18 28 views
2

中的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 

回答

1

將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" 
2

下面是使用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工作的數字。

相關問題