数据库有IP一列,我想取出时按从小到大排列,但因为是字符串型,排列结果变成了
x.x.x.1
x.x.x.10
x.x.x.11
x.x.x.2.....
有没有办法让字符串像数字一样从小到大排列?或者取出后在java中有什么办法?
高洛峰2017-04-18 09:56:59
Postgres本來就有IP型,設計的時候就應該用上當欄位類型
Anyway,既然你提到了這個問題,那就把它轉換成IP類型再排序即可
order by cast(ip as inet)
PHPz2017-04-18 09:56:59
轉成整數後排序。另外建議對於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();
}
PHP中文网2017-04-18 09:56:59
可以先將Ip位址轉為int類型,再存入資料庫。或資料庫中的字串取到Java中轉成Long再比較。
Ip位址又四個0-255組成,每個部分1Byte,四個部分剛好4Byte,也就是一個Integer。
巴扎黑2017-04-18 09:56:59
shell 就可以排序:
➜ ~ cat 1.txt
1.1.1.5
5.5.5.5
10.1.1.1
2.1.1.1
➜ ~ cat 1.txt|sort -n
1.1.1.5
2.1.1.1
5.5.5.5
10.1.1.1
➜ ~
在vim中排序:
:1,$!sort -n
最後給你個python版的:你用java照著改:
#!/usr/local/bin/python
#-*- coding: UTF-8 -*-
import re
#打开文件
fp=open("ip.txt")
content=fp.readlines()
# print(len(content))
ip_str=''
#p=re.compile("(\d{1,3})\.(\d{1,3}).(\d{1,3})\.(\d{1,3})")
c=list()
for i in range(len(content)):
c.append(content[i].replace('\n',''))
def ip2int(s):
l = [int(i) for i in s.split('.')]
return (l[0] << 24) | (l[1] << 16) | (l[2] << 8) | l[3]
c.sort(lambda x, y: cmp(ip2int(x), ip2int(y)))
print(c)
#重构换行
for j in range(len(c)):
c[j]=c[j]+'\n'
#写入到本地
succ_fp=open("ip_sort.txt","a+")
succ_fp.writelines(c)
succ_fp.close()
print("排序成功")
PHPz2017-04-18 09:56:59
轉成int再來排序吧
package org.plyy.utils;
public class IPUtil {
/**
* @param ip EG:192.168.1.1
* @return EG:0xc0a80101
*/
public static int ipToInteger(String ip) {
int result = 0;
String ipArr[] = ip.split("\.");
for(int i = 0; i < 4; i++) {
result |= Integer.parseInt(ipArr[i]) << ((3-i) * 8);
}
return result;
}
/**
*
* @param ip EG:0xc0a80101
* @return EG:192.168.1.1
*/
public static String intToIp(int ip) {
StringBuilder sb = new StringBuilder();
for(int i = 0; i < 4; i++) {
sb.append(String.valueOf((ip >>> (3-i) * 8) & 0xFF)).append(".");
}
sb.deleteCharAt(sb.length() - 1);
return sb.toString();
}
public static void main(String[] args) {
int result = ipToInteger("192.168.1.1");
System.out.println(Integer.toHexString(result));
System.out.println("-------------------------");
String result2 = intToIp(0xc0a80101);
System.out.println(result2);
}
}
PHP中文网2017-04-18 09:56:59
思路: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)));
PHP中文网2017-04-18 09:56:59
思路是把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