我有一个包含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
答案 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解释了运算符和您可以在inet
和cidr
数据类型上使用的函数。如果您需要能够单独获取IP地址和/或网络掩码,请记下masklen
和host
函数:
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)