一个排序问题,不知道用什么方法好!~
有一个排序,我自己写了一个查询: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)
&