2015-09-18 127 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