LINUX.ORG.RU
решено ФорумAdmin

Поиск пересекающихся адресов

 


0

1

Добрый день.

Прошу помощи в решении задачи.

На входе: таблица с списком подсетей из ~1к записей вида:

1 | 192.168.0.0/21 | description 1
2 | 10.0.5.0/24    | description 2
3 | 10.0.80.0/30   | description 3
и т.д.

На выходе хочется получить таблицу с списком пересекающихся подсетей.

Просьба подсказать есть ли какие нибудь готовые решения, или как подобное можно сделать?

Представь диапазоны как пару чисел (границ) и последовательно сравни каждую пару со всеми оставшимися. Или в чём проблема?

fenris ★★★★★ ()

postgresql и тип данных cidr.
операция сравнения «contains or equals» : n1.f1 >>= n2.f1

create table networks (id int, f1 cidr) ;
insert into networks values (1, network('192.168.0.0/21'));
insert into networks values (2, network('10.0.0.0/23'));
insert into networks values (3, network('10.0.1.0/23'));
insert into networks values (4, network('10.0.2.0/23'));
insert into networks values (5, network('10.0.3.0/23'));
insert into networks values (6, network('10.0.4.0/23'));
insert into networks values (7, network('10.0.5.0/23'));
insert into networks values (8, network('10.0.6.0/23'));
insert into networks values (9, network('10.0.7.0/23'));
insert into networks values (10, network('10.0.8.0/23'));
insert into networks values (11, network('10.0.80.0/20'));


select n1.id n1.f1, n2.f1 from networks n1 , networks n2 where n1.f1 >>= n2.f1 and n1.id != n2.id ; 

bl ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.