不要谷歌,只是尝试:
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="<"
);
有关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
$$;
好吧。我显然试过.. 错误:函数network_smaller(inet,inet)不存在 提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。 –
只是一个问题。依靠这种无证的功能有多安全? –
@PhilipCouling - 我们可以依靠内部功能吗?我认为,就所有运营商,索引,排序和大多数总计而言,都是基于它们的。 – klin