如果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;
因为,可以有多个同样好的比赛,我认为没有办法,只能分两步完成。有什么建议吗?
答案 0 :(得分: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
);
这样您就可以从路由表中获得最长的匹配前缀。