这是我的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
下面是一个使用方式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作品上。
混合阿尔法和数字到排序是困难的,但是如果格式是固定的它打破了其它的组件是可行的。在你的情况你可以,例如:
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"