oracle排序有哪几种方法,一个排序有关问题,不知道用什么方法好!

本文介绍了一位用户在Oracle数据库中遇到的一个排序难题,涉及到带有多个子级编号的记录排序。用户首先展示了自己的查询方法,然后给出了两种解决方案:一种是通过 substr 和 instr 函数拆分并按顺序排序,另一种是使用自定义函数Fun_Digit_Replace填充并排序。这两种方法都是针对字符串中包含分隔符的数字序列进行有效排序的策略。
摘要由CSDN通过智能技术生成

当前位置:我的异常网» Oracle管理 » 一个排序有关问题,不知道用什么方法好!

一个排序有关问题,不知道用什么方法好!

www.myexceptions.net  网友分享于:2013-01-16  浏览:12次

一个排序问题,不知道用什么方法好!~

有一个排序,我自己写了一个查询:select t.bjid, t.bjmc from scwl.wl_cpbom t order by to_number(replace(t.bjid,'-',''));其查询结果如下:

ID BJIDBJMC

---------------------------------

11孤形扇形段底座部件三

21大部件

31222

41-1支架

51-1支架

61-1锻造件

71-2轴承

81-2轴承

91-10222

101-1-1钢管01

我希望的结果入下:

ID BJIDBJMC

---------------------------------

11孤形扇形段底座部件三

21大部件

31222

41-1支架

51-1支架

61-1锻造件

71-1-1钢管01

81-2轴承

91-2轴承

101-10222

------解决方案--------------------

分别取出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)

59 ,0

文章评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值