本人初次使用oracle数据库,现在遇到一个问题。
在查询的时候要求按编码字段从小到大排序,但是这个字段是以字符串形式储存的数字(其中有个别尾数有个X),而且长短不一。
我使用order by NLSSORT(DWBM,'NLS_SORT = SCHINESE_PINYIN_M'),  to_number(translate(DWBM, '0123456789' || DWBM, '0123456789'))显示无效。
请朋友们解答一下。没有使用存储过程,所以希望能在查询语句中实现。谢谢!
字段值示例:
00150
001685428X
2510480
5612752174

解决方案 »

  1.   

    order by to_number(replace(DWBM,'X','')),dwbm
      

  2.   

    我的完整查询语句:
    select * from T_GG_XMXX where SFMJ <> 0 and XMBM like '"+XMbm+"' and XMMC like '"+XMmc+"' and rownum <= "+num+" order by ?
      

  3.   

    order by to_number(trim(replace(DWBM,'X',' '))),dwbm
    在试试,加个空格!
      

  4.   

    不行?报什么错
    XMBM like '"+XMbm+"' and 这里应该改成
    XMBM like '%"+XMbm+"%' and 少了百分号,xmmc也一样。按你那么写,like就相当于=了
    order by子句里,我不确定你要排序的规则如果字符串中只有'X'一个非数字的字符,
    to_number(translate(DWBM, '0123456789' || DWBM, '0123456789'))改成
    to_number(replace(dwbm,'X',''))就行了
      

  5.   


    我的XMbm和xmmc都是前后加上%的参数,执行以后没有任务错误,但是就是显示的数据还是没有按照编码字段排序。
      

  6.   

    你用的order 语句怎么写的,显示的结果能贴点例子,说说哪里不对吗with tt as(select '00150' dwbm from dual
      union all select '001685428X' from dual
      union all select '2510480' from dual
      union all select '5612752174' from dual)
      
    select * from tt
    order by to_number(replace(DWBM,'X',''))DWBM
    00150
    001685428X
    2510480
    5612752174
    这个是按DWDM中的数字部分,从小到大排序的你检查下自己的order by expression1,expression2
    先按前面的条件排序,相同条件下再按后面排序
      

  7.   

    这不是order by的问题,是分页的问题
      

  8.   

    现在使用的是 order by to_number(DWBM)
    现在这个表里面编码字段全是数字。
      

  9.   

    这个是首页的。
    sql = "select * from T_GG_ZSDW where SFMJ <> 0 and DWBM like '"+DWbm+"' and DWMC like '"+DWmc+"' and rownum <= "+num+" order by to_number(DWBM)";这个是非首页的。
    sql = "select * from (select a.*,rownum rn from (select * from T_GG_ZSDW where SFMJ <> 0 and DWBM like '"+DWbm+"' and DWMC like '"+DWmc+"') a where rownum <= "+lostNum+") where rn >= "+firstNum+" order by to_number(DWBM)";
      

  10.   

    改成这样试试
    sql = "select * from (select a.*,row_number()over(order by to_number(replace(dwbm,'X',''))) rn  from T_GG_ZSDW a where SFMJ <> 0 and DWBM like '"
    +DWbm+"' and DWMC like '"+DWmc+"')  where rn<= "+lostNum+" and rn >= "+firstNum+" order by rn";
      

  11.   

    首页就将上句的lostnum值赋成num,firstnum为0
    或者将+" and rn >= "+firstNum去掉,lostnum改成num
    其实分成2句没什么必要
      

  12.   

    yes!太感谢了,我好笨啊,怎么就没想到先排序再分页。嘿嘿。