如何比较 PostgreSQL 中特定范围的 IP 地址(其列数据类型为字符串数组)

问题描述 投票:0回答:1

在 PostgreSQL 中, 我有一个名为“IP”的列,其数据类型为数组。我想过滤IP在特定范围之间的记录。我尝试了下面的查询,但在 postgresql 中抛出错误。

 Select * from table1 where IP BETWEEN 10.2.0.0 AND 10.15.0.8

 Select * from table1 where IP > 10.2.0.0 AND IP < 10.15.0.8

 Select * from table1 where IP::inet < '127.0.0.1'::inet

由于 IP 列的数据类型是字符串或字符串数组,因此上述查询均无效

由于 IP 列的数据类型是字符串或字符串数组,因此上述查询均无效。 数据类型是String还是Array,如何比较和过滤记录?

我认为这可行

WITH expanded_ips AS ( SELECT id, unnest(IP) AS ip_address FROM your_table), filtered_ips AS ( SELECT id FROM expanded_ips WHERE inet(ip_address) >= inet('192.168.1.1')::inet AND inet(ip_address) <= inet('192.168.1.255')::inet);

SELECT DISTINCT yt.* FROM your_table yt JOIN filtered_ips fi ON yt.id = fi.id;

当我在 pgadmin 中运行以下查询时,它在(::inet) 处抛出错误

查询: 选择principal_ip 从 事件,unnest(principal.ip) 作为principal_ip WHERE inet(principal_ip) >= inet('192.168.1.1')::inet

错误: 语法错误:预期输入结束,但得到“:”

sql postgresql filter ip-address inet
1个回答
0
投票

要获取每个 IP 属于特定范围的 IP 地址列表,您可以使用以下命令:

WITH expanded_ips AS ( 
  SELECT id, IP as IPs, unnest(IP) AS IP 
  FROM table1
), 
filtered_ips AS ( 
  SELECT *
  FROM expanded_ips
  WHERE IP::inet BETWEEN inet '10.2.0.0' AND inet '10.15.0.8'
)
SELECT *
FROM filtered_ips;

演示在这里

© www.soinside.com 2019 - 2024. All rights reserved.