- 카테고리:
문자열 및 이진 함수 (일반)
PARSE_IP¶
유효한 INET(Internet Protocol) 또는 CIDR(Classless Internet Domain Routing) IPv4 또는 IPv6 문자열의 모든 구성 요소로 이루어진 JSON 오브젝트를 반환합니다.
구문¶
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
완전히 채워진 고정 크기 16진수 값으로 표현되는 IP 주소입니다.
hex_ipv6_range_start
네트워크의 완전히 채워진 고정 크기 16진수 시작 주소로, 서브넷 마스크가 입력에 포함될 때 표시됩니다.
hex_ipv6_range_end
네트워크의 완전히 채워진 고정 크기 16진수 끝 주소로, 서브넷 마스크가 입력에 포함될 때 표시됩니다.
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" | ------+------------------------------------+