だけしようと、グーグルはいけない:
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
$$;
私は明らかにそれを試みました.. エラー:function network_smaller(inet、inet)が存在しません ヒント:指定された名前と引数の型に一致する関数はありません。明示的な型キャストを追加する必要があるかもしれません。 –
ちょうど質問です。そのような文書化されていない機能に頼るのはどれくらい安全ですか? –
@ PhilipCouling - 内部機能に頼ることはできますか?私は、すべての演算子、インデックス、並べ替え、および大部分の集計がそれらに基づいている限り、そう考える。 – klin