2

我在 postgresql 8.3 数据库上。我试图找出错误在下面的查询中。我正在尝试设计一个查询以仅选择作为私有地址的 source_ips 和 destination_ips。

出于某种原因,在下面的查询中获取的地址之一是地址 208.117.252.39,它不是私有地址。

下面的查询中的逻辑是否有问题会使其也选择公共 IP 地址?

 select source_ip, destination_ip
from ip_table
where
    (
    inet '10/8' >> source_ip
    or inet '192.168/16' >> source_ip
    or source_ip >= inet '172.16/16' and source_ip < inet '172.32/16'
     )
    and  inet '10/8' >> destination_ip
    or  inet '192.168/16' >> destination_ip
4

2 回答 2

2

由于该and操作优先于or您,因此缺少括号。您的查询相当于:

select source_ip, destination_ip
from ip_table
where
    (
        (
        inet '10/8' >> source_ip
        or inet '192.168/16' >> source_ip
        or source_ip >= inet '172.16/16' and source_ip < inet '172.32/16'
        )
        and  inet '10/8' >> destination_ip
    )
    or  inet '192.168/16' >> destination_ip

正确的版本:

select source_ip, destination_ip
from ip_table
where
    (
        inet '10/8' >> source_ip
        or inet '192.168/16' >> source_ip
        or source_ip >= inet '172.16/16' and source_ip < inet '172.32/16'
    )
    and
    (
        inet '10/8' >> destination_ip
        or  inet '192.168/16' >> destination_ip
    )
于 2013-03-29T00:17:28.423 回答
1

您需要适当地对最终条件进行分组。现在,最后一个“或”忽略所有source_ip条件。

像这样构造查询:

select source_ip, destination_ip
from ip_table
where
(
  inet '10/8' >> source_ip
    or inet '192.168/16' >> source_ip
    or inet '172.16/12' >> source_ip
 )
and  (
  inet '10/8' >> destination_ip
    or  inet '192.168/16' >> destination_ip
    or inet '172.16/12' >> destination_ip
);

请注意,目标子句组合在一起。

于 2013-03-29T00:16:59.940 回答