Oracle 没有一种非常友好的方式来比较 IP 地址,因此需要单独比较每个数字。您可以尝试下面的解决方案,看看它是否适合您。我添加了名为COMMON_ROUTER_FROM_IP 的第三列,以显示 IP 地址在其范围内的 CommonRouter 的 FROM_IP。如果你不需要它,你可以删除它。
查询
WITH
routerip (TYPE, from_ip, to_ip)
AS
(SELECT 'Router1', '192.168.0.1', '192.168.0.1' FROM DUAL
UNION ALL
SELECT 'CommonRouter', '192.167.0.0', '192.167.0.90' FROM DUAL
UNION ALL
SELECT 'Router2', '10.120.0.1', '10.120.0.1' FROM DUAL
UNION ALL
SELECT 'CommonRouter', '10.120.0.1', '10.120.0.99' FROM DUAL
UNION ALL
SELECT 'Router3', '10.120.0.45', '10.120.0.45' FROM DUAL
UNION ALL
SELECT 'Router4', '10.120.0.34', '10.120.0.34' FROM DUAL
UNION ALL
SELECT 'Router5', '192.167.0.49', '192.167.0.49' FROM DUAL
UNION ALL
SELECT 'Router6', '192.128.0.1', '192.128.0.1' FROM DUAL
UNION ALL
SELECT 'Router6', '192.167.0.9', '192.167.0.9' FROM DUAL
UNION ALL
SELECT 'Router3', '10.120.0.3', '10.120.0.3' FROM DUAL)
SELECT r1.TYPE,
r1.from_ip,
(SELECT from_ip
FROM routerip r2
WHERE r2.TYPE = 'CommonRouter'
and to_number(REGEXP_SUBSTR (r1.from_ip, '[^.]+',1,1)) between to_number(REGEXP_SUBSTR (r2.from_ip, '[^.]+',1,1)) and to_number(REGEXP_SUBSTR (r2.to_ip, '[^.]+',1,1))
and to_number(REGEXP_SUBSTR (r1.from_ip, '[^.]+',1,2)) between to_number(REGEXP_SUBSTR (r2.from_ip, '[^.]+',1,2)) and to_number(REGEXP_SUBSTR (r2.to_ip, '[^.]+',1,2))
and to_number(REGEXP_SUBSTR (r1.from_ip, '[^.]+',1,3)) between to_number(REGEXP_SUBSTR (r2.from_ip, '[^.]+',1,3)) and to_number(REGEXP_SUBSTR (r2.to_ip, '[^.]+',1,3))
and to_number(REGEXP_SUBSTR (r1.from_ip, '[^.]+',1,4)) between to_number(REGEXP_SUBSTR (r2.from_ip, '[^.]+',1,4)) and to_number(REGEXP_SUBSTR (r2.to_ip, '[^.]+',1,4))
and rownum = 1) as common_router_from_ip
FROM routerip r1
WHERE r1.TYPE <> 'CommonRouter'
AND EXISTS
(SELECT 1
FROM routerip r2
WHERE r2.TYPE = 'CommonRouter'
and to_number(REGEXP_SUBSTR (r1.from_ip, '[^.]+',1,1)) between to_number(REGEXP_SUBSTR (r2.from_ip, '[^.]+',1,1)) and to_number(REGEXP_SUBSTR (r2.to_ip, '[^.]+',1,1))
and to_number(REGEXP_SUBSTR (r1.from_ip, '[^.]+',1,2)) between to_number(REGEXP_SUBSTR (r2.from_ip, '[^.]+',1,2)) and to_number(REGEXP_SUBSTR (r2.to_ip, '[^.]+',1,2))
and to_number(REGEXP_SUBSTR (r1.from_ip, '[^.]+',1,3)) between to_number(REGEXP_SUBSTR (r2.from_ip, '[^.]+',1,3)) and to_number(REGEXP_SUBSTR (r2.to_ip, '[^.]+',1,3))
and to_number(REGEXP_SUBSTR (r1.from_ip, '[^.]+',1,4)) between to_number(REGEXP_SUBSTR (r2.from_ip, '[^.]+',1,4)) and to_number(REGEXP_SUBSTR (r2.to_ip, '[^.]+',1,4)))
ORDER BY r1.type;
结果
TYPE FROM_IP COMMON_ROUTER_FROM_IP
__________ _______________ ________________________
Router2 10.120.0.1 10.120.0.1
Router3 10.120.0.3 10.120.0.1
Router3 10.120.0.45 10.120.0.1
Router4 10.120.0.34 10.120.0.1
Router5 192.167.0.49 192.167.0.0
Router6 192.167.0.9 192.167.0.0