不要谷歌,试试看:
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 Miscellaneous -> Show System Objects in treeview。
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
$$;