Postgres CIDR。如何只选择没有子网的网络?

时间:2011-11-15 06:45:04

标签: postgresql networking cidr

我有一个表格Net在哪里是网络列表

- 表:net

CREATE TABLE net
(
  id serial NOT NULL,
  cidr cidr,
  description text,
  CONSTRAINT net_pkey PRIMARY KEY (id )
)

我需要选择所有没有的网络。属于其他网络。即只有没有子网的网络。如何构建查询?

CIDR:
10.0.0.0/8
10.1.0.0/16
10.2.0.0/16
10.3.0.0/16
10.3.1.0/24
10.3.2.0/24
10.3.3.0/24
10.15.1.0/24
10.15.2.0/24
10.15.3.0/24
172.20.0.0/16
172.21.0.0/16
172.0.0.0/8
11.11.11.0/24
最高评分净值为10.0.0.0 / 8,172.0.0.0 / 8,11.11.11.0 / 24

1 个答案:

答案 0 :(得分:3)

我理解你的问题是这样的: 您需要所有未包含在任何其他网络规范中的网络规范,即不属于另一个网络规范的子网。

试试这个:

SELECT *
FROM   net
WHERE  NOT EXISTS (SELECT cidr FROM net n WHERE n.cidr >> net.cidr);

产生预期结果。
有关>>运算符的更多信息,请查看手册中的Network Address Functions and Operators一章 使用NOT EXISTS进行半联接可能是执行此操作的最快方法。