为了账号安全,请及时绑定邮箱和手机立即绑定

字符串型IP地址从小到大排序

字符串型IP地址从小到大排序

30秒到达战场 2019-03-06 14:15:56
数据库有IP一列,我想取出时按从小到大排列,但因为是字符串型,排列结果变成了x.x.x.1x.x.x.10x.x.x.11x.x.x.2.....有没有办法让字符串像数字一样从小到大排列?或者取出后在java中有什么办法?
查看完整描述

7 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

Postgres本来就有IP类型,设计的时候就应该用上作为字段类型

Anyway,既然你提到了这个问题,那就把它转化为IP类型再排序即可

order by cast(ip as inet)


查看完整回答
反对 回复 2019-04-24
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

转成整数后排序。另外建议对于IP这种字段,直接在数据库里面存整数而不是字符串


给你个转换的例子:


    public long ipToLong(String ipAddress) {

        long result = 0;

        String[] ipAddressInArray = ipAddress.split("\\.");


        for (int i = 3; i >= 0; i--) {

            long ip = Long.parseLong(ipAddressInArray[3 - i]);

            result |= ip << (i * 8);

        }


        return result;

    }


    public String longToIp(long ip) {

        StringBuilder sb = new StringBuilder(15);


        for (int i = 0; i < 4; i++) {

            sb.insert(0, Long.toString(ip & 0xff));

            if (i < 3) {

                sb.insert(0, '.');

            }

            ip = ip >> 8;

        }


        return sb.toString();

    }


查看完整回答
反对 回复 2019-04-24
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

可以先将Ip地址转为int类型,再存入数据库。或者数据库中的字符串取到Java中转成Long再比较。

Ip地址又四个0-255组成,每个部分1Byte,四个部分刚好4Byte,也就是一个Integer。


查看完整回答
反对 回复 2019-04-24
?
holdtom

TA贡献1805条经验 获得超10个赞

思路:order by每个字段


order by to_number(substr(ip, 1, instr(ip,'.',1,1)-1)),

  to_number(substr(ip,instr(ip, '.',1,1)+1,instr(ip, '.',1,2)-instr(ip, '.',1,1)-1)),

  to_number(substr(ip,instr(ip, '.',1,2)+1,instr(ip, '.',1,3)-instr(ip, '.',1,2)-1)),

  to_number(substr(ip,instr(ip, '.',1,3)+1,length(ip)-instr(ip, '.',1,3)));


查看完整回答
反对 回复 2019-04-24
?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

思路是把IP转成整数后排序:


<?php

$ip = array('127.0.0.3','127.0.0.1','127.0.0.2');

foreach($ip as $k => $v) {

    $ip[$k] = ip2long($v);

}

sort($ip);

var_export($ip);

foreach($ip as $k => $v) {

    echo long2ip($v)."\n";

}

//输出

array (

  0 => 2130706433,

  1 => 2130706434,

  2 => 2130706435,

)

127.0.0.1

127.0.0.2

127.0.0.3


查看完整回答
反对 回复 2019-04-24
  • 7 回答
  • 0 关注
  • 884 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信