当前位置: 代码迷 >> Oracle技术 >> 关于一个ORACLE 排序的有关问题, 急
  详细解决方案

关于一个ORACLE 排序的有关问题, 急

热度:69   发布时间:2016-04-24 08:25:51.0
关于一个ORACLE 排序的问题, 急!!!!
刚接手这块不久, 今天遇到了个问题, 以前开发的人直接把一个信息全部保存在一个字段里,导致现在用户需要这个字段进行排序,我很难实现, 坐等大神
with data as (
  select 'CCC[2007]111号' as book_no from dual union all
  select 'CCC[2007]112号' as book_no from dual union all
  select 'CCC[2007]22号' as book_no from dual union all
  select 'CCC[2007]56号' as book_no from dual union all
  select 'AAAAAAA[2007]121号' as book_no from dual union all
  select 'AAAAAAA[2007]122号' as book_no from dual union all
  select 'AAAAAAA[2007]2号' as book_no from dual union all
  select 'AAAAAAA[2008]33号' as book_no from dual union all
  select 'BBBB[2007]111号' as book_no from dual union all
  select 'BBBB[2007]112号' as book_no from dual union all
  select 'BBBB[2008]3号' as book_no from dual union all
  select 'BBBB[2008]56号' as book_no from dual
)
就像这个。 把相应的字符串 CCC 或者BBBB 先放一起,然后根据中间的年份进行排序,然后再根据后面的数字进行排序,我这里有一个
 select book_no
  from data
order by substr (book_no, 1, instr (book_no, ']')),
  to_number (
  replace (regexp_substr (book_no, '\]([[:digit:]]+)'), ']', ''))

但是这个只能把前面相同的 包括了年份放一起, 然后按照后面的数字进行排序, 在升序 降序的时候 中间的年份并没有做任何的操作,, 希望各位大神帮帮忙, 在把前面字符放一起的情况下, 还能按照中间的年份进行排序,最后在按照后面的数字进行排序
AAAAAAA[2008]33号
AAAAAAA[2007]2号  
AAAAAAA[2007]121号 
AAAAAAA[2007]122号 
BBBB[2008]3号  
BBBB[2008]56号  
BBBB[2007]111号  
BBBB[2007]112号  
CCC[2007]22号  
CCC[2007]56号  
CCC[2007]111号  
CCC[2007]112号

------解决方案--------------------
可以通过正则截取的方式来排序 比如:

SQL code
select *from dataorder by regexp_substr(book_no,'[A-Z]+'),regexp_substr(book_no,'[0-9]+')
------解决方案--------------------
SQL code
select *from dataorder by regexp_substr(book_no,'[A-Z]+'),regexp_substr(book_no,'[0-9]+')      ,to_number(substr(book_no,instr(book_no,']')+1,instr(book_no,'号')-instr(book_no,']')-1))
------解决方案--------------------
SQL code
          book_no--------------------------------1    AAAAAAA[2007]2号2    AAAAAAA[2007]121号3    AAAAAAA[2007]122号4    AAAAAAA[2008]33号5    BBBB[2007]111号6    BBBB[2007]112号7    BBBB[2008]3号8    BBBB[2008]56号9    CCC[2007]22号10    CCC[2007]56号11    CCC[2007]111号12    CCC[2007]112号
------解决方案--------------------
探讨
SQL code


select *
from data
order by regexp_substr(book_no,'[A-Z]+'),regexp_substr(book_no,'[0-9]+')
,to_number(substr(book_no,instr(book_no,']')+1,instr(book_no,'号')-instr(book_no,']')-……

------解决方案--------------------
排序还好像有问题
SQL code
with t as (  select 'CCC[2007]111号' as book_no from dual union all  select 'CCC[2007]112号' as book_no from dual union all  select 'CCC[2007]22号' as book_no from dual union all  select 'CCC[2007]56号' as book_no from dual union all  select 'AAAAAAA[2007]121号' as book_no from dual union all  select 'AAAAAAA[2007]122号' as book_no from dual union all  select 'AAAAAAA[2007]2号' as book_no from dual union all  select 'AAAAAAA[2008]33号' as book_no from dual union all  select 'BBBB[2007]111号' as book_no from dual union all  select 'BBBB[2007]112号' as book_no from dual union all  select 'BBBB[2008]3号' as book_no from dual union all  select 'BBBB[2008]56号' as book_no from dual)select book_no, substr(book_no,1,instr(book_no,'[')-1) head,regexp_substr(book_no,'[[:digit:]]+',1,1) yy,regexp_substr(book_no,'[[:digit:]]+',1,2) ed from torder by head asc,yy desc,ed asc
  相关解决方案