/ Найбільш довгий префікс IPv4 з використанням Postgres - postgresql, ipv4, найдовший префікс

Найбільш довгий префікс IPv4 з використанням Postgres - postgresql, ipv4, найдовший префікс

З огляду на 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
);

Таким чином, ви отримаєте найдовший відповідний префікс із таблиці маршрутизації.