- 类别:
字符串和二进制函数 (通用)
PARSE_IP¶
返回一个 JSON 对象,它由有效 INET(互联网协议)或 CIDR(无类别互联网域路由)IPv4 或 IPv6 字符串中的所有部分组成。
语法¶
PARSE_IP(<expr>, '<type>' [, <permissive>])
实参¶
必填:
expr
字符串表达式。
type
标识 IP 地址类型的字符串。支持
INET
或CIDR
;该值不区分大小写。
可选:
permissive
确定如何处理解析错误的标志:
如果设置为 0,则解析错误会导致函数失败。
如果设置为 1,则解析错误会导致具有
error
字段的对象设置为相应的错误消息(并且未设置其他字段)。
默认值为 0。
返回¶
使用说明¶
该函数解析 IP 地址并返回 JSON 对象。
始终返回以下元素:
family
数值。
4
(IPv4) 或6
(IPv6)。ip_type
字符串值。输入的
inet
或cidr
。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" | | } | --------------------+-----------------------------------+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" | } | ----------------------------------------------------------------+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" | | | } | ---------------+-------------------+-----------------------------------+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" | ------+------------------------------------+