如何使用postgres查询min或max inet / cidr

时间:2016-02-02 02:32:36

标签: sql postgresql postgres-9.4

考虑查询:

select min(d) from temp;
select max(d) from temp;

任何一个,我都会收到如下错误:

# select max(d) from temp;
ERROR:  function max(inet) does not exist
LINE 1: select max(d) from temp;
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

所以,我创建一个名为temp的表并填充它:

create table temp (d inet);
insert into temp (d) values ('1.1.10.2');
insert into temp (d) values ('1.1.10.10');
insert into temp (d) values ('1.1.10.20');
insert into temp (d) values ('1.1.10.100');

# select * from temp order by d;

     d      
------------
 1.1.10.2
 1.1.10.10
 1.1.10.20
 1.1.10.100
(4 rows)

因此,我可以使用host()转换为文本,但这会产生错误的答案:

select min(host(d)) from temp;

那是因为它正在执行文本'min'功能,这就是这个顺序:

# select host(d) as r from temp order by r;
     r      
------------
 1.1.10.10
 1.1.10.100
 1.1.10.2
 1.1.10.20
(4 rows)

postgres中的ip类型是否有min()和max()函数?有办法欺骗它(转换为int和比较,或通过限制执行订单)。我对正确的min()和max()更感兴趣。谢谢你!

-g

2 个答案:

答案 0 :(得分:1)

您可以使用现有功能network_smaller(inet, inet)network_larger(inet, inet)来定义自己的聚合:

create aggregate min (inet) (
    sfunc = network_smaller,
    stype = inet);

create aggregate max (inet) (
    sfunc = network_larger,
    stype = inet);

select min(d) min, max(d) max
from temp;

   min    |    max     
----------+------------
 1.1.10.2 | 1.1.10.100
(1 row)

答案 1 :(得分:0)

我再次检查,pg仍然不支持min(inet)。我想你可以做的是制作另一个专栏来映射inet,例如replace(r,'。','')和min()它。