如何将oracle sql结果按数字顺序排列

如何将oracle sql结果按数字顺序排列,oracle,sql-order-by,natural-sort,Oracle,Sql Order By,Natural Sort,这就是我的Oracle SQL命令的外观: select domain from table1 order by 1 desc 以下是返回数据的实际顺序: us9.aaa.com us8.aaa.com us10.aaa.com us1.aaa.com 我的问题是,如何使返回的数据按如下顺序排列 us10.aaa.com us9.aaa.com us8.aaa.com us1.aaa.com 将字母和数字混合到排序中是困难的,但是如果格式是固定的,则可以通过分解组件来实现。例如,在您

这就是我的Oracle SQL命令的外观:

select domain 
from table1 
order by 1 desc
以下是返回数据的实际顺序:

us9.aaa.com
us8.aaa.com
us10.aaa.com 
us1.aaa.com
我的问题是,如何使返回的数据按如下顺序排列

us10.aaa.com
us9.aaa.com
us8.aaa.com
us1.aaa.com

将字母和数字混合到排序中是困难的,但是如果格式是固定的,则可以通过分解组件来实现。例如,在您的情况下,您可以:

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\u replace()的方法。它不关心要排序的域名数字部分前面有多少非数字字符(也不关心数字部分有多大):

正则表达式可以理解为“在字符串开头查找一个或多个非数字字符,后跟一个或多个数字组成的记忆组,后跟一个文字句点,后跟任意数量的字符(直到暗示字符串结尾)”。“\1”表示返回第一个记忆的组,即数字,该数字转换为ORDER BY所使用的数字

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>