我有一个表,包括IP地址和他们的网络掩码,现在我想从表中选择IP,这些IP按网络地址在同一个网络中。
ip_adress | netmask
----------------|-----------
192.168.13.25 | 29
192.168.13.26 | 29
192.168.13.1 | 30
192.168.13.2 | 30
例如,我希望表中的I位于网络地址192.168.13.24/29中:
ip_adress | netmask
----------------|-----------
192.168.13.25 | 29
192.168.13.26 | 29
发布于 2015-10-09 23:34:14
使用PostgreSQL的网络地址功能和操作员,您可以轻松地通过以下方式获得它:
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
发布于 2015-10-09 23:30:22
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)
对于整个故事,此页解释了inet
数据类型(以及它的兄弟cidr
,这不是您所需要的),而此页解释了您可以在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)
https://stackoverflow.com/questions/33051357
复制相似问题