2015-09-18 82 views
4

我拥有数十万个IP,并且想要确定哪些IP位于特定范围内。 范围:SQL中的IP范围

64.233.160.0/8192 
66.102.0.0/4096 
66.249.64.0/8192 
72.14.192.0/16384 
74.125.0.0/65536 
209.85.128.0/32768 
216.239.32.0/8192 

所以我转换这些范围为以下内容:

64.233.160.0 - 64.233.192.0 
66.102.0.0  - 66.102.16.0 
66.249.64.0  - 66.249.96.0 
72.14.192.0  - 72.15.0.0 
74.125.0.0  - 74.126.0.0 
209.85.128.0 - 209.86.0.0 
216.239.32.0 - 216.239.64.0 

所以现在我想查询如果一个IP地址是在这个范围内的。 SQL不会理解八位字节,所以我不知道该怎么做。

可以使用一些Hex2Dec/Dec2Hex转换?

我想这应该是以前做过的事情,我敢肯定我不是第一个尝试使用ip范围来识别特定ip的列表。

我会做一下UPS在多个IP地址,所以有些可能是20.0.1.123,另一个可能是124.123.123.1,即八位组的格式是不一样的

+0

这里是一个[样品](http://stackoverflow.com/questions/29740014/query-for-matching-ip-address -in-sql-server) –

+0

什么味道/版本的SQL? SQL Server,Oracle,mySQL? [mySQL](https://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_inet-aton)可以使用函数INET_ATON将地址转换为可用于比较:请注意,这只适用于IPv4 ...... IPv6必须使用不同的东西。 – xQbert

+0

谷歌大查询 – Oliver

回答

3

您可以我们IP functions此:

PARSE_IP('64.233.160.0') returns 1089052672 

,然后你可以在之间的状态将它们包装。

+0

谢谢! 我将制定出范围,然后尝试使用类似于: 如果PARSE_IP('ip')BETWEEN x和y THEN ... – Oliver

2

IP数字是真的只是整数。你在这里做的是你已经将它们保存为可读的字符串。您将需要将它们转换回其原始整数表示形式,以便您可以用正常的BETWEEN声明查询。

+0

但正常数字不是基数256. 你是说类似于: a * 16,777,216 + b * 65,536 + c * 256 + d – Oliver

+0

是的,这就是我所说的。基本256表示仅适用于人类,与“2 KiB”适用于人类的方式相同,而“2048”适用于计算机。你不会存储“2 KiB”,因为它使得数字难以比较和索引。 –

0

Pentium10的答案对Legacy Bigquery语法是正确的。对于任何人谁发生使用StandardSQL BIGQUERY语法你正在寻找这是:

NET.IP_FROM_STRING('64 .233.160.0' )返回1089052672

0

对于BigQuery的标准SQL来转换IP到整数的方法是如下

#standardSQL 
SELECT NET.IPV4_TO_INT64(NET.IP_FROM_STRING('64.233.160.0')) 

随着SQL UDF的使用可以简化到像下面

#standardSQL 
CREATE TEMP FUNCTION ip2int(ip STRING) AS (
    NET.IPV4_TO_INT64(NET.IP_FROM_STRING(ip)) 
); 
WITH Ranges AS (
    SELECT '64.233.160.0' AS IP1, '64.233.192.0' AS IP2 UNION ALL 
    SELECT '66.102.0.0', '66.102.16.0' UNION ALL 
    SELECT '66.249.64.0', '66.249.96.0' UNION ALL 
    SELECT '72.14.192.0', '72.15.0.0' UNION ALL 
    SELECT '74.125.0.0', '74.126.0.0' UNION ALL 
    SELECT '209.85.128.0', '209.86.0.0' UNION ALL 
    SELECT '216.239.32.0', '216.239.64.0' 
), 
IPs AS (
    SELECT '64.233.160.2' AS IP UNION ALL 
    SELECT '72.14.192.101' 
) 
SELECT * 
FROM IPs AS i 
JOIN Ranges AS r 
ON ip2int(IP) BETWEEN ip2int(IP1) AND ip2int(IP2) 

在这里输出作为

IP    IP1    IP2 
72.14.192.101 72.14.192.0  72.15.0.0  
64.233.160.2 64.233.160.0 64.233.192.0  

更多信息有关NET functionsSQL UDF