2016-08-19 20 views
0

でサブネット/マスクからIP MAXとMINを取得:私は次の問題を持っているpostgresの

今私は、サブネット/マスク情報(例えば、192.168.1.0/255.255.255.0)を持つテーブルを持っている..しかしIこのサブネットから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版-redhatの-のlinux-gnuの上

のPostgreSQL 9.2.15、GCCでコンパイル(GCC)4.8.5 20150623(Red Hatの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の2,600以上の内部の機能を持っています。それらのほとんどは、さまざまなタイプの演算子クラスを作成するのに便利です。それらのすべてがドキュメントに記載されているわけではありませんが、一般的に利用可能です。

pg_catalogでpgAdmin IIIを使用して見つけることができます。オプションを設定する必要があるのは、ファイル - >オプション - > UIその他 - >ツリービューのシステムオブジェクトを表示するだけです。


集約関数min(inet)max(inet)Postgresの9.5に導入されている:

CREATE AGGREGATE min(inet) (
    SFUNC=network_smaller, 
    STYPE=inet, 
    SORTOP="<" 
); 

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に見出すことができる)が定義されている方法を参照してください

質問How to query for min or max inet/cidr with postgresPostgres 9.4。私の答えでは、network_smaller(inet, inet)network_larger(inet, inet)の機能を使用することを提案しました。私はそれらが集計関数min(inet)max(inet)を作成するために追加されたと確信していますが、何らかの理由で(おそらく監視しています)集約はPostgreSQL 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

私は明らかにそれを試みました.. エラー:function network_smaller(inet、inet)が存在しません ヒント:指定された名前と引数の型に一致する関数はありません。明示的な型キャストを追加する必要があるかもしれません。 –

+0

ちょうど質問です。そのような文書化されていない機能に頼るのはどれくらい安全ですか? –

+0

@ PhilipCouling - 内部機能に頼ることはできますか?私は、すべての演算子、インデックス、並べ替え、および大部分の集計がそれらに基づいている限り、そう考える。 – klin

2

とにかくあなたのニーズには関係ないと思います。定義された最小値と最大値は、SQL min()max()関数に似ています。サブネット内の最小値/最大値ではなく、テーブル内の最小値/最大値を検索する関数です。

私は一般に、文書化されていない機能に依存するファンではありません。彼らはかもしれない安全ですが、かもしれない私は一般的に好きな言葉ではありません。

文書化されたネットワーク機能のページはここにあります: https://www.postgresql.org/docs/current/static/functions-net.html

あなたが必要となる2は、次のようになります。

  • Minはnetwork(inet)
  • マックスだろうがbroadcast(inet)

だろうこれは、ネットワーク名が常に範囲内の最初のIPであり、bロードキャストアドレスは常に範囲内の最後のIPです。

関連する問題