7 回答
TA贡献1943条经验 获得超7个赞
Postgres本来就有IP类型,设计的时候就应该用上作为字段类型
Anyway,既然你提到了这个问题,那就把它转化为IP类型再排序即可
order by cast(ip as inet)
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();
}
TA贡献1816条经验 获得超4个赞
可以先将Ip地址转为int类型,再存入数据库。或者数据库中的字符串取到Java中转成Long再比较。
Ip地址又四个0-255组成,每个部分1Byte,四个部分刚好4Byte,也就是一个Integer。
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)));
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
添加回答
举报