类别:

字符串和二进制函数 (通用)

PARSE_IP

返回一个 JSON 对象,它由有效 INET(互联网协议)或 CIDR(无类别互联网域路由)IPv4 或 IPv6 字符串中的所有部分组成。

语法

PARSE_IP(<expr>, '<type>' [, <permissive>])
Copy

实参

必填:

expr

字符串表达式。

type

标识 IP 地址类型的字符串。支持 INETCIDR;该值不区分大小写。

可选:

permissive

确定如何处理解析错误的标志:

  • 如果设置为 0,则解析错误会导致函数失败。

  • 如果设置为 1,则解析错误会导致具有 error 字段的对象设置为相应的错误消息(并且未设置其他字段)。

默认值为 0。

返回

OBJECT

使用说明

  • 该函数解析 IP 地址并返回 JSON 对象。

    始终返回以下元素:

    family

    数值。4 (IPv4) 或 6 (IPv6)。

    ip_type

    字符串值。输入的 inetcidr

    host

    字符串值。输入表达式中的主机地址。

    ip_fields

    4 个数值字段的数组,每个数值字段的值介于 0 和 4,294,967,295 (2^32 - 1) 之间(包括这两个值)。此数组中的位值映射到主机地址中的原始位。

    • IPv4 地址:仅显示主机地址最右边的 32 位。

    • IPv6 地址:从左到右显示映射到原始 128 位主机地址的每个 32 位字段。

    如果输入子网掩码,则结果包括 network_prefix_length,这是一个标识子网掩码长度的数值。

    会为 IPv4 地址返回以下元素:

    ipv4

    ip_fields 中的第一个字段匹配的数字 IP 地址。

    ipv4_range_start

    网络的数字起始地址,在输入中包含子网掩码时显示。

    ipv4_range_end

    网络的数字结束地址,在输入中包含子网掩码时显示。

    会为 IPv6 地址返回以下元素:

    hex_ipv6

    用完全填充的固定大小十六进制值表示的 IP 地址。

    hex_ipv6_range_start

    网络的完全填充的固定大小十六进制起始地址,在输入中包含子网掩码时显示。

    hex_ipv6_range_end

    网络的完全填充的固定大小十六进制结束地址,在输入中包含子网掩码时显示。

    snowflake$type 元素是为内部 Snowflake 使用而保留的。

  • 对于 IP 地址范围计算或子网掩码搜索,请直接查询单个 JSON 元素。请参阅以下示例。

  • 输入子网掩码时,Snowflake 建议将函数输出存储在 VARIANT 列中,并根据生成的元素进行查询以获得更好的性能。请参阅示例。

示例

SELECT column1, PARSE_IP(column1, 'INET') FROM VALUES('192.168.242.188/24'), ('192.168.243.189/24');
--------------------+-----------------------------------+
 COLUMN1            | PARSE_IP(COLUMN1, 'INET')         |
--------------------+-----------------------------------|
 192.168.242.188/24 | {                                 |
                    |   "family": 4,                    |
                    |   "host": "192.168.242.188",      |
                    |   "ip_fields": [                  |
                    |     3232297660,                   |
                    |     0,                            |
                    |     0,                            |
                    |     0                             |
                    |   ],                              |
                    |   "ip_type": "inet",              |
                    |   "ipv4": 3232297660,             |
                    |   "ipv4_range_end": 3232297727,   |
                    |   "ipv4_range_start": 3232297472, |
                    |   "netmask_prefix_length": 24,    |
                    |   "snowflake$type": "ip_address"  |
                    | }                                 |
 192.168.243.189/24 | {                                 |
                    |   "family": 4,                    |
                    |   "host": "192.168.243.189",      |
                    |   "ip_fields": [                  |
                    |     3232297917,                   |
                    |     0,                            |
                    |     0,                            |
                    |     0                             |
                    |   ],                              |
                    |   "ip_type": "inet",              |
                    |   "ipv4": 3232297917,             |
                    |   "ipv4_range_end": 3232297983,   |
                    |   "ipv4_range_start": 3232297728, |
                    |   "netmask_prefix_length": 24,    |
                    |   "snowflake$type": "ip_address"  |
                    | }                                 |
--------------------+-----------------------------------+
Copy
SELECT PARSE_IP('fe80::20c:29ff:fe2c:429/64', 'INET');

----------------------------------------------------------------+
  PARSE_IP('FE80::20C:29FF:FE2C:429/64', 'INET')                |
----------------------------------------------------------------|
  {                                                             |
    "family": 6,                                                |
    "hex_ipv6": "FE80000000000000020C29FFFE2C0429",             |
    "hex_ipv6_range_end": "FE80000000000000FFFFFFFFFFFFFFFF",   |
    "hex_ipv6_range_start": "FE800000000000000000000000000000", |
    "host": "fe80::20c:29ff:fe2c:429",                          |
    "ip_fields": [                                              |
      4269801472,                                               |
      0,                                                        |
      34351615,                                                 |
      4264297513                                                |
    ],                                                          |
    "ip_type": "inet",                                          |
    "netmask_prefix_length": 64,                                |
    "snowflake$type": "ip_address"                              |
  }                                                             |
----------------------------------------------------------------+
Copy
WITH
lookup AS (
  SELECT column1 AS tag, PARSE_IP(column2, 'INET') AS obj FROM VALUES('San Francisco', '192.168.242.0/24'), ('New York', '192.168.243.0/24')
),
entries AS (
  SELECT PARSE_IP(column1, 'INET') AS ipv4 FROM VALUES('192.168.242.188/24'), ('192.168.243.189/24')
)
SELECT lookup.tag, entries.ipv4:host, entries.ipv4
FROM lookup, entries
WHERE lookup.tag = 'San Francisco'
AND entries.IPv4:ipv4 BETWEEN lookup.obj:ipv4_range_start AND lookup.obj:ipv4_range_end;

---------------+-------------------+-----------------------------------+
 TAG           | ENTRIES.IPV4:HOST | IPV4                              |
---------------+-------------------+-----------------------------------|
 San Francisco | "192.168.242.188" | {                                 |
               |                   |   "family": 4,                    |
               |                   |   "host": "192.168.242.188",      |
               |                   |   "ip_fields": [                  |
               |                   |     3232297660,                   |
               |                   |     0,                            |
               |                   |     0,                            |
               |                   |     0                             |
               |                   |   ],                              |
               |                   |   "ip_type": "inet",              |
               |                   |   "ipv4": 3232297660,             |
               |                   |   "ipv4_range_end": 3232297727,   |
               |                   |   "ipv4_range_start": 3232297472, |
               |                   |   "netmask_prefix_length": 24,    |
               |                   |   "snowflake$type": "ip_address"  |
               |                   | }                                 |
---------------+-------------------+-----------------------------------+
Copy
CREATE OR REPLACE TABLE ipv6_lookup (tag String, obj VARIANT);

-----------------------------------------+
 status                                  |
-----------------------------------------|
 Table IPV6_LOOKUP successfully created. |
-----------------------------------------+

INSERT INTO ipv6_lookup
    SELECT column1 AS tag, parse_ip(column2, 'INET') AS obj
    FROM VALUES('west', 'fe80:12:20c:29ff::/64'), ('east', 'fe80:12:1:29ff::/64');

-------------------------+
 number of rows inserted |
-------------------------|
                       2 |
-------------------------+

CREATE OR REPLACE TABLE ipv6_entries (obj VARIANT);
------------------------------------------+
 status                                   |
------------------------------------------|
 Table IPV6_ENTRIES successfully created. |
------------------------------------------+

INSERT INTO ipv6_entries
    SELECT parse_ip(column1, 'INET') as obj
    FROM VALUES
        ('fe80:12:20c:29ff:fe2c:430:370:2/64'),
        ('fe80:12:20c:29ff:fe2c:430:370:00F0/64'),
        ('fe80:12:20c:29ff:fe2c:430:370:0F00/64'),
        ('fe80:12:20c:29ff:fe2c:430:370:F000/64'),
        ('fe80:12:20c:29ff:fe2c:430:370:FFFF/64'),
        ('fe80:12:1:29ff:fe2c:430:370:FFFF/64'),
        ('fe80:12:1:29ff:fe2c:430:370:F000/64'),
        ('fe80:12:1:29ff:fe2c:430:370:0F00/64'),
        ('fe80:12:1:29ff:fe2c:430:370:00F0/64'),
        ('fe80:12:1:29ff:fe2c:430:370:2/64');

-------------------------+
 number of rows inserted |
-------------------------|
                      10 |
-------------------------+

SELECT lookup.tag, entries.obj:host
    FROM ipv6_lookup AS lookup, ipv6_entries AS entries
    WHERE lookup.tag = 'east'
    AND entries.obj:hex_ipv6 BETWEEN lookup.obj:hex_ipv6_range_start AND lookup.obj:hex_ipv6_range_end;

------+------------------------------------+
 TAG  | ENTRIES.OBJ:HOST                   |
------+------------------------------------|
 east | "fe80:12:1:29ff:fe2c:430:370:FFFF" |
 east | "fe80:12:1:29ff:fe2c:430:370:F000" |
 east | "fe80:12:1:29ff:fe2c:430:370:0F00" |
 east | "fe80:12:1:29ff:fe2c:430:370:00F0" |
 east | "fe80:12:1:29ff:fe2c:430:370:2"    |
------+------------------------------------+
Copy
语言: 中文