首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >oracle双数据排序

oracle双数据排序
EN

Stack Overflow用户
提问于 2017-05-06 21:28:12
回答 3查看 52关注 0票数 0

我想对以下类型的数据进行排序

代码语言:javascript
复制
ms3_fldr01
ms14_fldr01
ms13_fldr01
ms13_fldp01
ms30_fldr01
ms20_fldp01
ms9_fldr01
ms14_fldp01
ms4_fldp01
ms5_fldr01
ms1_fldp01
ms3_fldr01
ms8_fldr01

这样,fldp01将首先出现,然后出现fldr01。在最早出现的fldp01 first (ms)部分的数据集中必须排序( ms1...ms10),在fldr01数据集的第一(ms)部分也必须排序。如下所示

代码语言:javascript
复制
ms1_fldp01
ms4_fldp01
ms13_fldp01
ms14_fldp01
ms20_fldp01
ms3_fldr01
ms5_fldr01
ms8_fldr01
ms9_fldr01
ms13_fldr01
ms14_fldr01
ms30_fldr01

我已经尝试了下面的方法,但这并不是按照预期给出数据集。

代码语言:javascript
复制
select
    server, count(*) as C
from TEST
where d_updated_date >= trunc(sysdate-4) 
group by server
order by
    replace(replace(server,'_fldr01'),'ms') desc,
    (case when substr(server,instr(server,'_')+1)='fldp01' then 1 
          when substr(server,instr(server,'_')+1)='fldp02' then 2 
          else 0 end) desc;

你能帮帮忙吗??

EN

回答 3

Stack Overflow用户

发布于 2017-05-06 21:32:01

您可以使用regexp_substr

代码语言:javascript
复制
select *
from test
order by regexp_substr(server, '_\w+'),
  to_number(regexp_substr(server, '\d+'));
票数 2
EN

Stack Overflow用户

发布于 2017-05-06 21:32:56

我认为这将会做你想要的:

代码语言:javascript
复制
order by (case when server like '%_fldp%' then 1 else 2 end),
         length(server),
         server

(注意:我知道下划线在like中是一个特殊字符,但上面的仍然有效。)

这取决于_之后的零件的长度是固定的。否则,您将需要做更多的工作来分离出第一个组件。

票数 1
EN

Stack Overflow用户

发布于 2017-05-06 21:38:06

我期望使用普通字符串函数的解决方案优于基于正则表达式的解决方案。

代码语言:javascript
复制
SELECT *
FROM yourTable
ORDER BY
    LENGTH(SUBSTR(server, INSTR(server, '_') + 1)),
    SUBSTR(server, INSTR(server, '_') + 1),
    LENGTH(SUBSTR(server, 1, INSTR(server, '_') - 1)),
    SUBSTR(server, 1, INSTR(server, '_') - 1)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43821015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档