从postgres的子网/掩码中获取最大和最小ip



我有以下问题:

现在我有一个子网/掩码信息表(例如192.168.1.0/255.255.255.0)..但是我需要从这个子网获得最大和最小IP:

192.168.1.0/192.168.1.255

我找到了这个答案:

如何使用postgres查询最小/最大inet/cidr

但似乎:

network_small (inet, inet) network_bigger (inet, inet)

并不存在。即使谷歌一下,我也找不到这些功能的答案。

谢谢!

编辑:

版本信息:

PostgreSQL 9.2.15 on x86_64-redhat-linux-gnu,编译gcc (gcc) 4.8.5 20150623 (Red Hat 4.8.5-4), 64位

我认为那个问题与你的需求无关。这里定义的min和max类似于SQL的min()max()函数,用于查找表中的最小/最大,而不是子网中的最小/最大。

我一般不喜欢依赖未记录的特性。它们可能是安全的,但可能不是我通常喜欢的词。

这里有一页关于网络函数的文档:https://www.postgresql.org/docs/current/static/functions-net.html

你需要的两个是:

  • 最小值为network(inet)
  • 最大值为broadcast(inet)

这是因为网络名称总是范围内的"第一个"ip,而广播地址总是范围内的"最后一个"ip。

不要谷歌,试试:

select network_smaller('192.168.0.9'::inet, '192.168.0.11'::inet);
 network_smaller 
-----------------
 192.168.0.9
(1 row)
Postgres有超过2600个内部函数。它们中的大多数对于创建各种类型的操作符类都很有用。并非所有这些都在文档中有描述,但它们都是普遍可用的。

可以在pg_catalog中使用pgAdmin III找到它们。你只需要设置如下选项:文件->选项-> UI杂项->显示系统对象


聚合函数min(inet)max(inet)已经在Postgres 9.5中引入。:

with test(ip) as (
values 
    ('192.168.0.123'::inet),
    ('192.168.0.12'),
    ('192.168.0.1'),
    ('192.168.0.125')   
)
select max(ip), min(ip)
from test;
      max      |     min     
---------------+-------------
 192.168.0.125 | 192.168.0.1
(1 row) 

查看聚合min(inet)是如何定义的(它可以在pg_catalog中找到):

CREATE AGGREGATE min(inet) (
  SFUNC=network_smaller,
  STYPE=inet,
  SORTOP="<"
);

问题如何查询与postgres相关的min或max inet/cidr postgres 9.4。在我的回答中,我建议使用network_smaller(inet, inet)network_larger(inet, inet)函数。我确信它们是为了创建聚合函数min(inet)max(inet)而添加的,但由于某些原因(可能是疏忽),聚合只出现在Postgres 9.5中。

Postgres 9.2中,您可以创建自己的函数作为替代,例如

create or replace function inet_larger(inet, inet)
returns inet language sql as $$
    select case when network_gt($1, $2) then $1 else $2 end
$$;
create or replace function inet_smaller(inet, inet)
returns inet language sql as $$
    select case when network_lt($1, $2) then $1 else $2 end
$$;

最新更新