2016-08-19 89 views
0

我有以下問題:獲取從Postgres的子網/掩碼MAX和MIN IP

現在我有子網/掩碼信息(例如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

卜t將其看來:

network_smaller(INET,INET)network_larger(INET,INET)

不存在。即使使用谷歌搜索,我找不到這些功能的任何答案。

謝謝!

編輯:

版本信息:在x86_64-紅帽Linux的GNU的

PostgreSQL的9.2.15,由GCC編譯(GCC)4.8.5 20150623(紅帽4.8.5-4 ),64位

回答

0

不要谷歌,只是嘗試:

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 
$$; 
+0

好吧。我顯然試過.. 錯誤:函數network_smaller(inet,inet)不存在 提示:沒有函數匹配給定的名稱和參數類型。您可能需要添加顯式類型轉換。 –

+0

只是一個問題。依靠這種無證的功能有多安全? –

+0

@PhilipCouling - 我們可以依靠內部功能嗎?我認爲,就所有運營商,索引,排序和大多數總計而言,都是基於它們的。 – klin

2

我不認爲這個問題是相關的,無論如何你的需要。此處定義的最小值和最大值與用於查找表中最小/最大值的SQL min()max()函數相似,而不是子網中最小/最大值。

我通常不是依靠無證功能的粉絲。他們可能是安全的,但可能是不是我一般喜歡的詞。

有記錄在案的網絡功能的頁面在這裏: https://www.postgresql.org/docs/current/static/functions-net.html

你需要將兩個:

  • 民會network(inet)
  • 馬克斯將broadcast(inet)

這是因爲網絡名稱始終是範圍內的「第一個」ip和b roadcast地址始終是範圍內的「最後」ip。