不要谷歌,只是嘗試:
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