数据库表中有张ip表,我想按ip字段,该字段是varchar2类型的进行排序,发现不行,求高手帮助!!!
select * from tab_ip order by ip asc;结果排序不是规则的如图:,怎么办??求高手

解决方案 »

  1.   

    原因估计是因为 ip数字有的为1位,有的为2位,有的为3尾。oracle中有个LPAD(c1,n[,c2])函数
    在字符串c1的左边用字符串c2填充,直到长度为n时为止可以用这个函数将位数不足3位的在左面补0 。之后再根据这个字段排序。应该可以。
    其他数据库不知道有没有这个函数
      

  2.   

    思路很简单replace(ip,'.',"") 然后把其转换成数字类型进行排序..
      

  3.   

    sql不容易排,还是取出来之后用java排吧。
      

  4.   

    主要是ip的之后 有的是2位,有的是3位。要想办法把不足3位的,在前面补0例如 192.168.1.20 变成 192.168.1.020这样排出来就规则了,
    但是sql估计不容易实现。
      

  5.   

    java好实现,但是数据库应该没有方便的函数这样做。
      

  6.   

    是好实现,但是数据量大,又有分页的,如果是java排序的话,每次都得一次性取出所有数据,这效率……
      

  7.   

    to_char(ip,'999.999.999.999')转换一下试试  ps:这个不一定能成,但是这种思路应该是可以的  
      

  8.   

    不大明白你说的意思,能给个完整的sql语句吗?
      

  9.   

    CAST ( ip AS number(4) ) asc
    用这个试试吧,应该好用的
      

  10.   


    第一种方式:select * 
    from users
    order by
    cast(substring(IP, 1, charindex('.',IP)-1) as numeric),
    cast(substring(IP,  charindex('.',IP)+1,  charindex('.',IP,charindex('.',IP)+1)-charindex('.',IP)-1) as numeric),
    cast(substring
                 (
                   IP,  
                   charindex('.',IP,charindex('.',IP)+1)+1, 
                   charindex('.',IP,charindex('.',IP,charindex('.',IP)+1)+1)-charindex('.',IP,charindex('.',IP)+1)-1
                 )
         as numeric),
    cast(
    substring
        (
                  IP,
          charindex('.',IP,charindex('.',IP,charindex('.',IP)+1)+1)+1,
          len(IP)-charindex('.',IP,charindex('.',IP,charindex('.',IP)+1)+1)
                  
                )
    as numeric)
    第二种:
    if exists (select * from dbo.sysobjects) 
    drop function [dbo].[Get_Full_IP] 
    GO 
    create FUNCTION [dbo].[Get_Full_IP] (@IP nvarchar(20)) 
    RETURNS varchar(20)
    AS
    BEGIN
    DECLARE @result varchar(20)
    set @result=right('000'+ParseName(@IP,4),3)+'.'+right('000'+ParseName(@IP,3),3)+'.'+right('000'+ParseName(@IP,2),3)+'.'+right('000'+ParseName(@IP,1),3)
    return @result
    ENDgoselect [dbo].[Get_Full_IP](ip) as ip from users order by ip
    第二种存在弊端,就是加上的0没有移除,在想怎么搞掉。
      

  11.   

    这个是Oracle的还是mysql的,这语句我怎么都运行不起来??!!!
      

  12.   

    users改成你的表名,ip改为你的ip字段名
      

  13.   

    order by regexp_substr(ip,'[^.]+',1,1)+0,regexp_substr(ip,'[^.]+',1,2)+0,
             regexp_substr(ip,'[^.]+',1,3)+0,regexp_substr(ip,'[^.]+',1,4)+0
      

  14.   

    不过可惜只是Oracle的,我现在用hibernate,要是有个通用的hql语句就好了。
    不过可惜只是Oracle的,我现在用hibernate,要是有个通用的hql语句就好了。
    不过可惜只是Oracle的,我现在用hibernate,要是有个通用的hql语句就好了。
    不过可惜只是Oracle的,我现在用hibernate,要是有个通用的hql语句就好了。
      

  15.   

    17楼的运行结果
    ID NvarIP
    1 192.168.0.1
    4 192.168.0.90
    2 192.168.0.112
    3 192.168.0.133
    5 192.168.1.133用临时表直观点吧