我正在尋找一種方法,使用內置的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