如何从 PostgreSQL 中的两个 IP 获取 CIDR?

Posted

技术标签:

【中文标题】如何从 PostgreSQL 中的两个 IP 获取 CIDR?【英文标题】:How can I get a CIDR from two IPs in PostgreSQL? 【发布时间】:2016-11-18 12:32:49 【问题描述】:

在 PostgreSQL 中,我可以获得 CIDR 范围的上限和下限,如下所示。 但是如何从两个 IP 地址(通过 SQL)获取 CIDR? 例如

输入“192.168.0.0”;“192.168.255.255” 输出“192.168.0.0/16”

SELECT 
     network
    ,network::cidr 
    -- http://technobytz.com/ip-address-data-types-postgresql.html
    --,netmask(network::cidr) AS nm  
    --,~netmask(network::cidr) AS nnm
    ,host(network::cidr) AS lower 
    ,host(broadcast(network::cidr)) AS upper -- broadcast: last address in the range
    ,family(network::cidr) as fam  -- IPv4, IPv6
    ,masklen(network::cidr) as masklen
FROM 
(
          SELECT CAST('192.168.1.1/32' AS varchar(100)) as network 
    UNION SELECT CAST('192.168.0.0/16' AS varchar(100)) as network 
    --UNION SELECT CAST('192.168.0.1/16' AS varchar(100)) as network 

) AS tempT

【问题讨论】:

select inet_merge('192.168.0.0','192.168.255.255'); 【参考方案1】:

我想你在找inet_merge:

test=> SELECT inet_merge('192.168.0.0', '192.168.128.255');
┌────────────────┐
│   inet_merge   │
├────────────────┤
│ 192.168.0.0/16 │
└────────────────┘
(1 row)

【讨论】:

以上是关于如何从 PostgreSQL 中的两个 IP 获取 CIDR?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 PostgreSQL 中的 JSONB 数组中获取特定对象的值?

如何从 PostgreSQL 中的 2 列中获取唯一值

如何在 postgresql 视图中获取两个日期时间字段的天数和小时数差异?

如何在 POSTGRESQL 中从两个不同的数据库中检索数据

如何从Postgresql中的工作日编号中获取日期名称?

正确查询以获取 PostgreSQL 数据库中的当前连接数