我在以下布局中存储的网络中有大量子网。这用作主表来存储资源,这些资源将用于定期通过Python脚本自动探测状态。PostgreSQL将cidr扩展为单独的地址
CREATE TEMP TABLE tmp_networks (
network cidr PRIMARY KEY
);
让我们假设它充斥着这些价值观用于演示的缘故:
- 10.0.0.0/8
- 10.0.1.0/24
- 192.168.0.0/24
当我运行该脚本时,Python脚本将执行以下查询以删除任何重叠:
SELECT network
FROM tmp_networks
WHERE NOT EXISTS (
SELECT network
FROM tmp_networks n
WHERE n.network >> tmp_networks.network
);
这很好,除了一个小问题;我也有一份应该从工作中排除的个人地址列表。这也是在数据库中的表:
CREATE TEMP TABLE tmp_except (
address inet PRIMARY KEY
);
让我们假设这包含以下地址:
- 10.0.0.100
- 192.168.0.10
现在,我已经失败找到一个从数据库输出中删除这些特定地址的好方法。在我的思想,解决办法是这样的:
- 选择所有子网
- 如有异常地址在子网内发现,分裂子网成更小的碎片,直到唯一的例外地址可以被删除,所有其他地址仍然
我试图调查是否有这样的事情可以在纯PostgreSQL中做,但没有找到任何方法来解决这个问题。任何指针应该如何解决?
您对查询的期望结果是什么?它总是*地址(/ 32)*还是它*网络地址如果可能的话,只有地址,如果有例外*? – Beryllium
嗨,我除了网络地址,如果可能的话OR/32如果没有更大的块存在。 – agnsaft