如何在SQL中选择同一网络中的IP

时间:2015-10-10 07:13:51

标签: sql postgresql

我有一个包含IP地址及其网络掩码的表,现在我希望通过网络地址从同一网络中选择表中的IP。

asyncFunctionA() {
    self.asyncFunctionB()
}

例如,我想从表中的IP到网络地址192.168.13.24/29:

   ip_adress    |  netmask
----------------|-----------
 192.168.13.25  |    29    
 192.168.13.26  |    29
 192.168.13.1   |    30
 192.168.13.2   |    30

2 个答案:

答案 0 :(得分:4)

PostgreSQL实际上有一个本地inet类型,用于在一个字段中存储带有网络掩码的IP地址,以及用于匹配这些地址的专用运算符。

示例:

test=# \d inetdemo 
  Table "public.inetdemo"
 Column | Type | Modifiers 
--------+------+-----------
 addr   | inet | 

test=# select * from inetdemo;
       addr       
------------------
 192.168.13.25/29
 192.168.13.26/29
 192.168.13.1/30
 192.168.13.2/30
(4 rows)

test=# select * from inetdemo where addr >>= '192.168.13.25/29';
       addr       
------------------
 192.168.13.25/29
 192.168.13.26/29
(2 rows)

对于完整的故事,this page解释了inet数据类型(及其兄弟cidr,这不是您需要的),而this page解释了运算符和您可以在inetcidr数据类型上使用的函数。如果您需要能够单独获取IP地址和/或网络掩码,请记下masklenhost函数:

test=# select host(addr) as "ip_address", masklen(addr) as "netmask" from inetdemo;
  ip_address   | netmask 
---------------+---------
 192.168.13.25 |      29
 192.168.13.26 |      29
 192.168.13.1  |      30
 192.168.13.2  |      30
(4 rows)

答案 1 :(得分:1)

使用PostgreSQL Network Address Functions and Operators,您可以轻松获得:

SELECT * FROM network_adresse_table 
WHERE network(cast(format('%1$s/%2$s',ip_adress,netmask) as inet)) = 
cast('192.168.13.24/29' as inet)

这是SQL Fiddle