postgress | sql |仅当子网是给定ip列表的一部分时获取行

5kgi1eie  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(229)

我有一个带有文本列的表,其中包含子网的ip

| ip
-------------
| 1.1.1.1/30

当您将1.1.1.1/30转换为ip列表时,您将得到:

1.1.1.0
1.1.1.1
1.1.1.2
1.1.1.3

我想在这个表上运行一个sql,并给出一个ip列表作为where或其他任何内容的一部分,并且仅当我给出的ip列表包含行中范围的ip时,才能得到此行。
意思是,

where ('1.1.1.0','1.1.1.1)

-->我不想吵架
但是:

where ('1.1.1.0','1.1.1.1,1.1.1.2,1.1.1.3)

-->我去划船
但是:

where ('1.1.1.0','1.1.1.1,1.1.1.2,1.1.1.3,1.1.1.4,1.1.1.5)

-->我去划船
有什么办法吗?

pgky5nke

pgky5nke1#

你必须扩大范围 inet 所有的 host 值,然后使用包含来实现这一点:

with blowout as (
  select t.ip, array_agg(host(network(t.ip::inet) + gs.n)) as all_ips
    from t
   cross join lateral 
         generate_series(0, broadcast(t.ip::inet) - network(t.ip::inet)) as gs(n)
   group by t.ip;
)
select *
  from blowout
 where all_ips <@ array['1.1.1.0', '1.1.1.1', '1.1.1.2', 
                        '1.1.1.3', '1.1.1.4', '1.1.1.5']::text[] 
;

因为你没有使用任何特殊的 inet 在比较函数时,最好用 text .

相关问题