- 카테고리:
문자열 및 이진 함수 (일반)
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" | ------+------------------------------------+