我有以下问题:
现在我有一个包含子网/掩码信息的表(例如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位
答案 0 :(得分:2)
我认为这个问题无论如何都与你的需求有关。定义的最小值和最大值类似于SQL min()
和max()
函数,用于查找表中的最小/最大值,而不是子网中最小/最大值。
我通常不依赖于无证件的功能。他们可能是安全的,但可能不是我喜欢的词。
这里有一个记录网络功能的页面: https://www.postgresql.org/docs/current/static/functions-net.html
你需要的两个是:
network(inet)
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
$$;