З огляду на IP-адресу 192.168.0.1 і таблицю з колонкою next_hop_subnet, що зберігає IP-адреси підмережі, ви бачите будь-яку проблему з наступною логікою PostGRESQL, точністю або продуктивністю:
minDif := select min(abs(inet "192.168.0.1" - next_hop_subnet::inet))
from routing_table
where next_hop_subnet::inet >>= inet "192.168.0.1";
select *
from routing_table
where next_hop_subnet::inet >>= inet "192.168.0.1"
AND abs(inet "192.168.0.1" - next_hop_subnet::inet) = minDif;
Оскільки, може бути декілька однакових хороших матчів, я думаю, що немає ніякого способу, як зробити це у два кроки. Будь-які пропозиції?
Відповіді:
1 для відповіді № 1Я хотів би використовувати masklen(inet)
функції для замовлення відповідей, наприклад:
SELECT * FROM routing_table
WHERE next_hop_subnet::inet >>= inet "192.168.0.1"
AND masklen(next_hop_subnet::inet) = (
SELECT masklen(next_hop_subnet::inet) FROM routing_table
WHERE next_hop_subnet::inet >>= inet "192.168.0.1")
ORDER BY masklen(next_hop_subnet::inet) DESC
LIMIT 1
);
Таким чином, ви отримаєте найдовший відповідний префікс із таблиці маршрутизації.