日期:2014-05-16  浏览次数:20971 次

关于一个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 data
order by regexp_substr(book_no,'[A-Z]+'),regexp_substr(book_no,'[0-9]+')

------解决方案--------------------
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,']')-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 t
order by head asc,yy desc,ed asc