【问题标题】: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"  
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-27
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多