7 回答

TA貢獻(xiàn)1943條經(jīng)驗 獲得超7個贊
Postgres本來就有IP類型,設(shè)計的時候就應(yīng)該用上作為字段類型
Anyway,既然你提到了這個問題,那就把它轉(zhuǎn)化為IP類型再排序即可
order by cast(ip as inet)

TA貢獻(xiàn)1842條經(jīng)驗 獲得超13個贊
轉(zhuǎn)成整數(shù)后排序。另外建議對于IP這種字段,直接在數(shù)據(jù)庫里面存整數(shù)而不是字符串
給你個轉(zhuǎn)換的例子:
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貢獻(xiàn)1816條經(jīng)驗 獲得超4個贊
可以先將Ip地址轉(zhuǎn)為int類型,再存入數(shù)據(jù)庫?;蛘邤?shù)據(jù)庫中的字符串取到Java中轉(zhuǎn)成Long再比較。
Ip地址又四個0-255組成,每個部分1Byte,四個部分剛好4Byte,也就是一個Integer。

TA貢獻(xiàn)1805條經(jīng)驗 獲得超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貢獻(xiàn)1906條經(jīng)驗 獲得超3個贊
思路是把IP轉(zhuǎn)成整數(shù)后排序:
<?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
添加回答
舉報