日期:2014-05-17  浏览次数:20846 次

一个排序问题,不知道用什么方法好!~
有一个排序,我自己写了一个查询:select t.bjid, t.bjmc from scwl.wl_cpbom t order by to_number(replace(t.bjid,'-',''));其查询结果如下:
ID BJID BJMC
---------------------------------
1 1 孤形扇形段底座部件三
2 1 大部件
3 1 222
4 1-1 支架
5 1-1 支架
6 1-1 锻造件
7 1-2 轴承
8 1-2 轴承
9 1-10 222
10 1-1-1 钢管01

我希望的结果入下:
ID BJID BJMC
---------------------------------
1 1 孤形扇形段底座部件三
2 1 大部件
3 1 222
4 1-1 支架
5 1-1 支架
6 1-1 锻造件
7 1-1-1 钢管01
8 1-2 轴承
9 1-2 轴承
10 1-10 222


------解决方案--------------------
分别取出1-1-1三个数字再排序
select bjid, bjid||'--' CC
from
(select '1-1' as bjid from dual
union 
select '1-2' as bjid from dual
union 
select '1-10-1' as bjid from dual
union 
select '1-1-1' as bjid from dual)
order by 
to_number(substr(CC,1,instr(CC,'-')-1)),
to_number(substr(CC,instr(CC,'-',1,1)+1,instr(CC,'-',1,2)-instr(CC,'-',1,1)-1)),
to_number(substr(CC,instr(CC,'-',1,2)+1,instr(CC,'-',1,3)-instr(CC,'-',1,2)-1))
------解决方案--------------------
写函数,假设你每个"-"分隔的小节的长度不大于3,总字符串长度小于等于150,可以用看下我写的脚本

SQL> create or replace function Fun_Digit_Replace(P_C_InStr varchar2
2 ,P_C_SepStr varchar2
3 ,P_N_LenPerSite number)
4 return varchar2 is
5
6 /*==========================================================================
7
8 功能: 填充指定字符串的每一节到指定长度,不够的在左恻用0补足,并将分隔符去除
9
 10 作者: Powerise.GuoYong-Dai
 11
 12 说明: 此程序仅供个人学习交流,违者也没法追究
 13
 14 ============================================================================*/
 15
 16 Result varchar2(150);
 17 V_N_Site1 number;
 18 V_N_Site2 number;
 19 V_C_InStr varchar2(150);
 20 V_C_LeftStr varchar2(150);
 21 V_C_RightStr varchar2(150);
 22 V_C_TempStr varchar2(150);
 23 begin
 24
 25 Result := null;
 26 V_C_InStr := P_C_InStr;
 27
 28 if P_C_InStr is null or length(P_C_InStr) < 1 then
 29 return Result;
 30 end if;
 31
 32 if P_C_InStr is null or length(P_C_InStr) < 1 then
 33 return P_C_InStr;
 34 end if;
 35
 36 IF P_N_LenPerSite IS NULL OR P_N_LenPerSite < 1 THEN
 37 return Result;
 38 END IF;
 39 dbms_output.put_line(V_C_InStr);
 40 dbms_output.put_line(P_N_LenPerSite);
 41 LOOP
 42 EXIT WHEN INSTR(V_C_InStr,P_C_SepStr) < 1;
 43 V_C_LeftStr := substr(V_C_InStr,1,INSTR(V_C_InStr,P_C_SepStr)-1);
 44 V_C_TempStr := null;
 45 select substr(V_C_InStr
 46 ,INSTR(V_C_InStr,P_C_SepStr) + Length(P_C_SepStr)
 47 ,Decode( INSTR(V_C_InStr,P_C_SepStr,1,2)
 48 ,0
 49 ,Length(V_C_InStr) + 1
 50 ,INSTR(V_C_InStr,P_C_SepStr,1,2) - INSTR(V_C_InStr,P_C_SepStr) - 1
 51 )
 52 ) into V_C_TempStr
 53 from dual;
 54
 55
 56 V_C_RightStr := null;
 57 select substr(V_C_InStr
 58 ,Decode( INSTR(V_C_InStr,P_C_SepStr,1,2)
&