查找分配给单个路由器但也是分配给通用路由器的 IP 的一部分的 IP [关闭]

Posted

技术标签:

【中文标题】查找分配给单个路由器但也是分配给通用路由器的 IP 的一部分的 IP [关闭]【英文标题】:Find IP's which are assigned to Individual Router but also are part of IPs assigned to Common Router [closed] 【发布时间】:2020-09-22 19:50:48 【问题描述】:

请查看我的表格 (RouterIP),其中包含 3 列及以下数据: 我想找到分配给特定路由器的 IP,它们也是通用路由器的一部分。通用路由器也可能有范围。 因此,我需要检查这些范围之间的路由器 IP 并填充数据。

请有任何解决此问题的建议。

期望的输出:

链接到文本格式的数据:

https://pastebin.ubuntu.com/p/YGRGQJJQ7n/

【问题讨论】:

请将源数据粘贴为可以复制的文本而不是图像。这将使试图帮助您提出解决方案的用户更容易。 Router3 有两行,From_IPTo_IP 列的值相等。 @BarbarosÖzhan 是的,路由器的表中有多个值。 @EJEgyed 谢谢。我为文本添加了一个 Pastebin 链接。 pastebin.ubuntu.com/p/YGRGQJJQ7n 我的意思是根据所需的输出,每个路由器应该有一行,这样多行的规则是什么,我们如何决定返回哪一行? 【参考方案1】:

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

【讨论】:

@EJEgyed 的圣人! ;-) .. 祝大家好运。 谢谢@EJEgyed。我会尝试这个解决方案并回来【参考方案2】:

我是这样理解的:

select a.type, a.from_ip
from router a join router b on a.from_ip between b.from_ip and b.to_ip 
where b.type =  'CommonRouter'
  and a.type <> 'CommonRouter'

【讨论】:

以上是关于查找分配给单个路由器但也是分配给通用路由器的 IP 的一部分的 IP [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

路由器的ip地址是怎么分配的

不是重启一次路由器IP地址会变,为啥我没有变???

如何给家里面3台电脑分配IP地址及其子网掩码

esp8266 连接上家里的WiFi后,在电脑cmd里ping不通路由器分配给esp8266的ip是怎么回事?

怎么用路由器分配ip地址

IP 地址是如何分配给 ISP 的?