【问题标题】:how to have the oracle sql results in a numeric order如何让 oracle sql 结果以数字顺序排列
【发布时间】:2015-11-18 19:52:00
【问题描述】:
这就是我的 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
【解决方案1】:
这是一种使用 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 处理的数字。
【解决方案2】:
将字母和数字混合到排序中很困难,但是如果格式是固定的,则可以通过分解组件来实现。例如,您可以:
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"