0

给定一个 IP 地址 192.168.0.1,以及一个包含存储子网 IP 地址的 next_hop_subnet 列的表,您是否发现以下 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;

因为,可以有多个同样好的匹配,我认为除了分两步之外别无他法。有什么建议么?

4

1 回答 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
 );

这样您就可以从路由表中获得最长的匹配前缀。

于 2014-06-10T12:11:50.843 回答