使用SQL检测重叠的IP地址范围
我正在使用一个应用程序,该应用程序具有用于存储IP地址范围的下表:使用SQL检测重叠的IP地址范围,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我正在使用一个应用程序,该应用程序具有用于存储IP地址范围的下表: IP_RANGE -------- RANGE_ID primary key NETWORK_ID foreign key into NETWORK table (not described here) IP_ID foreign key into IP_ADDRESS table RANGE_TYPE varchar, values "START" or "END" IP_ADDRESS
IP_RANGE
--------
RANGE_ID primary key
NETWORK_ID foreign key into NETWORK table (not described here)
IP_ID foreign key into IP_ADDRESS table
RANGE_TYPE varchar, values "START" or "END"
IP_ADDRESS
----
IP_ID primary key
IP_NETWORK number (decimal representation of network portion of address)
IP_INTERFACE number (decimal representation of interface portion of address)
给定的IP地址范围由IP地址范围表中的两行表示:一行的范围类型值为“开始”,另一行的值为“结束”,这两行的网络ID值相同。每一行还指向IP地址表中存储实际地址的一行
我需要写一个SELECT语句,它给我所有的网络ID,这些网络ID的IP范围与给定的任意IP范围有共同的地址
我知道如何检查IP地址表以查找在我所需范围之内或之外的各个地址,但我不知道如何将搜索限制为仅具有相同网络ID的开始/结束对
(我想这是一个纯粹的SQL问题,而不是专门针对IP地址的问题。)
Oracle Database 11g Enterprise Edition 11.1.0.7.0版-64位生产版您需要将
IP_范围
加入到自身中,以通过单个查询获取范围开始和范围结束的信息。您还需要将每次出现的IP\u范围
加入到IP\u地址
,以便进行IP地址比较;总之,你会得到这样的结果:
SELECT ip_range_start.network_id
FROM ip_range ip_range_start
JOIN ip_address ip_range_start_address
ON ip_range_start.ip_id = ip_range_start_address.ip_id
JOIN ip_range ip_range_end
ON ip_range_start.network_id = ip_range_end.network_id
JOIN ip_address ip_range_end_address
ON ip_range_end.ip_id = ip_range_end_address.ip_id
WHERE ip_range_start.range_type = 'START'
AND ip_range_end.range_type = 'END'
AND ( ... -- ip_range_start_address less than or equal to end of desired IP range
OR ... -- ip_range_end_address greater than or equal to start of desired IP range
)
;
你能举例说明IP_地址表中的内容吗?这两列是否表示CIDR符号的两部分(例如192.168.1.0/24)?IP_地址表中的一行表示单个IP地址。例如,IP地址1.2.3.4的IP_网络值为258,IP_接口值为772。(我认为该表旨在分别存储网络和接口部分,以提供与IPv4和IPv6地址的兼容性;IPv6地址太大,无法存储为单个整数。)为了更全面地解释,IP_网络值是地址的前16位,IP_接口值是最后16位。(如果使用IPv6范围,则将64替换为16。)