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

Foa*_*ebi 0 sql postgresql

我有一个包含 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
Run Code Online (Sandbox Code Playgroud)

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

   ip_adress    |  netmask
----------------|-----------
 192.168.13.25  |    29    
 192.168.13.26  |    29
Run Code Online (Sandbox Code Playgroud)

Wou*_*lst 5

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)
Run Code Online (Sandbox Code Playgroud)

对于完整的故事,本页解释了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)
Run Code Online (Sandbox Code Playgroud)