如何有一个数字顺序的Oracle SQL结果

问题描述 投票:2回答:2

这是我的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-order-by natural-sort
2个回答
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>

正则表达式可被理解为“查找在字符串的开头,接着是记忆组的一个或多个数字,然后是文字期间,随后通过任何数目的任何字符的一个或多个非数字字符(直到是字符串的结尾是隐含的)”。在“\ 1”是指返回第一个记忆组是多少,这是转换成一个数字是什么ORDER BY作品上。


1
投票

混合阿尔法和数字到排序是困难的,但是如果格式是固定的它打破了其它的组件是可行的。在你的情况你可以,例如:

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"  
© www.soinside.com 2019 - 2024. All rights reserved.