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 に答える