我正在寻找一种方法,使用内置的cidr类型从存储在postgresql中的cidr块获取直接的子网。postgresql cidr查找子块
例数据库
CREATE TABLE nets (
id serial primary key,
net cidr
);
INSERT INTO nets (net) VALUES
('10.1.0.0/16'),
('10.1.0.0/20'),
('10.1.1.0/24'),
('10.1.1.8/29'),
('10.1.1.32/28'),
('10.2.15.0/24'),
('10.2.15.64/27')
所需的查询应该F.E.
- 为searchkey 10.1.0.0/16
- 10.1.1.8/29和10.1.1.32/28为searchkey回报10.1.0.0/20 10.1.1.0/24
我想出了与是(http://sqlfiddle.com/#!15/2b4b5/1):
SELECT
id,
net
FROM
nets n
WHERE
net << '10.1.1.0/24' AND
'10.1.1.0/24' IN (
SELECT
net
FROM
nets
WHERE
net >> n.net
ORDER BY
net DESC
LIMIT 1
)
ORDER BY
net
这给出了期望的结果,但它不能扩展。即使在数据库中只有几千个条目,这个速度也会非常慢。
有没有另外一种方法来实现这一点,而不添加显式的父/子关系到数据库模型?
哇谢谢你的投入。如果新的查询和索引帮助我的案例,我将准备一组更大的测试数据并报告回来。 – 2015-02-10 12:03:58
只有当没有间歇性块时,您的查询似乎才有效。如果查询10.1.0.0/20,它应该返回10.1.1.0/24。 http://sqlfiddle.com/#!15/2b4b5/6 – 2015-02-10 12:26:30
@andrekeller抱歉,在except子句中选择了错误的表。现在修好。 – pozs 2015-02-10 12:46:48