2013-03-28 184 views
1

我在一個postgresql 8.3數據庫。我正試圖找出下面查詢中的錯誤。我試圖設計一個查詢來只選擇私人地址的source_ips和destination_ips。SQL查詢選擇公共IP地址

由於某種原因,在下面的查詢中抓取的地址之一是地址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 
+0

是,如果更改了相同> =以>>和< to >>? –

+0

爲了清楚起見,嘗試用「inet」172.16/12'>> source_ip「替換」source_ip> = inet'172.16/16'和source_ip hoxworth

回答

1

,需要相應地組最終條件。現在,最後的「或」忽略了所有的條件。

結構查詢作爲這樣的:

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 
); 

注意目標子句組合在一起。

1

由於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 
    )