Skip to main content
Version: 1.1.1

IP Functions

    ip_prefix(ip_address, prefix_bits) -> ipprefix

返回给定 ``ip_address`` 的 IP 前缀,其子网大小为 ``prefix_bits``。``ip_address``
可以是 ``VARCHAR`` 类型,也可以是 ``IPADDRESS`` 类型。

SELECT ip_prefix(CAST('192.168.255.255' AS IPADDRESS), 9); -- {192.128.0.0/9}
SELECT ip_prefix('2001:0db8:85a3:0001:0001:8a2e:0370:7334', 48); -- {2001:db8:85a3::/48}
    ip_subnet_min(ip_prefix) -> ip_address

返回由“ip_prefix”指定的子网中“IPADDRESS”类型的最小 IP 地址。

SELECT ip_subnet_min(IPPREFIX '192.168.255.255/9'); -- {192.128.0.0}
SELECT ip_subnet_min(IPPREFIX '2001:0db8:85a3:0001:0001:8a2e:0370:7334/48'); -- {2001:db8:85a3::}
    ip_subnet_max(ip_prefix) -> ip_address

返回由“ip_prefix”指定的子网中“IPADDRESS”类型最大的 IP 地址。

SELECT ip_subnet_max(IPPREFIX '192.64.0.0/9'); -- {192.127.255.255}
SELECT ip_subnet_max(IPPREFIX '2001:0db8:85a3:0001:0001:8a2e:0370:7334/48'); -- {2001:db8:85a3:ffff:ffff:ffff:ffff:ffff}
    ip_subnet_range(ip_prefix) -> array(ip_address)

返回一个包含 2 个 IP 地址的数组。该数组包含 ``ip_prefix`` 指定的子网中最小和最大的 IP 地址。

SELECT ip_subnet_range(IPPREFIX '1.2.3.160/24'); -- [{1.2.3.0}, {1.2.3.255}]
SELECT ip_subnet_range(IPPREFIX '64:ff9b::52f4/120'); -- [{64:ff9b::5200}, {64:ff9b::52ff}]
    is_subnet_of(ip_prefix, ip_address) -> boolean

如果“ip_address”位于“ip_prefix”的子网中,则返回“true”。

SELECT is_subnet_of(IPPREFIX '1.2.3.128/26', IPADDRESS '1.2.3.129'); -- true
SELECT is_subnet_of(IPPREFIX '64:fa9b::17/64', IPADDRESS '64:ffff::17'); -- false
    is_subnet_of(ip_prefix1, ip_prefix2) -> boolean

如果“ip_prefix2”是“ip_prefix1”的子网,则返回“true”。

SELECT is_subnet_of(IPPREFIX '192.168.3.131/26', IPPREFIX '192.168.3.144/30'); -- true
SELECT is_subnet_of(IPPREFIX '64:ff9b::17/64', IPPREFIX '64:ffff::17/64'); -- false
SELECT is_subnet_of(IPPREFIX '192.168.3.131/26', IPPREFIX '192.168.3.131/26'); -- true
    ip_prefix_collapse(array(ip_prefix)) -> array(ip_prefix)

返回输入“IPPREFIX”数组的最小 CIDR 表示。输入数组中的每个“IPPREFIX”都必须是相同的 IP 版本(即仅 IPv4 或仅 IPv6),否则查询将失败并引发错误

SELECT IP_PREFIX_COLLAPSE(ARRAY[IPPREFIX '192.168.0.0/24', IPPREFIX '192.168.1.0/24']); -- [{192.168.0.0/23}]
SELECT IP_PREFIX_COLLAPSE(ARRAY[IPPREFIX '2620:10d:c090::/48', IPPREFIX '2620:10d:c091::/48']); -- [{2620:10d:c090::/47}]
SELECT IP_PREFIX_COLLAPSE(ARRAY[IPPREFIX '192.168.1.0/24', IPPREFIX '192.168.0.0/24', IPPREFIX '192.168.2.0/24', IPPREFIX '192.168.9.0/24']);
-- [{192.168.0.0/23}, {192.168.2.0/24}, {192.168.9.0/24}]
    ip_prefix_subnets(ip_prefix, prefix_length) -> array(ip_prefix)

返回大小为“prefix_length”的“ip_prefix”子网。“prefix_length”必须有效(对于 IPv4 为 [0, 32],对于
IPv6 为 [0, 128]),否则查询将失败并引发错误。如果“prefix_length”比“ip_prefix”短(即更不具体),则返回空数组。

SELECT IP_PREFIX_SUBNETS(IPPREFIX '192.168.1.0/24', 25); -- [{192.168.1.0/25}, {192.168.1.128/25}]
SELECT IP_PREFIX_SUBNETS(IPPREFIX '2a03:2880:c000::/34', 36); -- [{2a03:2880:c000::/36}, {2a03:2880:d000::/36}, {2a03:2880:e000::/36}, {2a03:2880:f000::/36}]
    is_private_ip(ip_address) -> boolean

傳回類型為「IPADDRESS」的「ip_address」是否為私有IP位址或保留IP位址
IANA 認為該位址無法在全球範圍內存取。欲了解更多信息,請參閱“IANA IPv4 特殊用途
地址註冊表](https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml)
以及「IANA IPv6 專用[網址註冊表](https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml)。
`Null` 輸入回傳 `null`。

SELECT is_private_ip(IPADDRESS '10.0.0.1'); -- true
SELECT is_private_ip(IPADDRESS '192.168.0.1'); -- true
SELECT is_private_ip(IPADDRESS '157.240.200.99'); -- false
SELECT is_private_ip(IPADDRESS '2a03:2880:f031:12:face:b00c:0:2'); -- false