如何将oracle sql结果按数字顺序排列
这就是我的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 将字母和数字混合到排序中是困难的,但是如果格式是固定的,则可以通过分解组件来实现。例如,在您
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>