在postgres中从子网/掩码中获取MAX和MIN ip

时间:2016-08-19 17:58:43

标签: postgresql

我有以下问题:

现在我有一个包含子网/掩码信息的表(例如192.168.1.0 / 255.255.255.0)..但我需要从该子网获取MAX和MIN IP:

192.168.1.0 / 192.168.1.255

我找到了这个答案:

how to query for min or max inet/cidr with postgres

但似乎:

network_smaller(inet,inet) network_larger(inet,inet)

不存在。即使是谷歌搜索,我也无法找到这些功能的答案。

谢谢!

编辑:

版本信息:

在x86_64-redhat-linux-gnu上的PostgreSQL 9.2.15,由gcc(GCC)4.8.5 20150623(Red Hat 4.8.5-4)编译,64位

2 个答案:

答案 0 :(得分:2)

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

我通常不依赖于无证件的功能。他们可能是安全的,但可能不是我喜欢的词。

这里有一个记录网络功能的页面: https://www.postgresql.org/docs/current/static/functions-net.html

你需要的两个是:

  • Min将是network(inet)
  • Max将是broadcast(inet)

那是因为网络名称始终是"第一个" ip在范围内,广播地址始终是" last" ip在范围内。

答案 1 :(得分:0)

不要谷歌,只需尝试:

select network_smaller('192.168.0.9'::inet, '192.168.0.11'::inet);

 network_smaller 
-----------------
 192.168.0.9
(1 row)

Postgres拥有超过2,600个内部功能。其中大多数对于创建各种类型的运算符类很有用。并非所有这些都在文档中描述,但它们通常都可用。

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

Postgres 9.5 中引入了汇总函数min(inet)max(inet)

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="<"
);

问题How to query for min or max inet/cidr with postgres涉及 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
$$;