PARSE_IP
PARSE_IP
PARSE_IP 함수는 유효한 INET(인터넷 프로토콜) 또는 CIDR(클래스 없는 인터넷 도메인 라우팅) IPv4 또는 IPv6 문자열의 모든 구성 요소로 이루어진 JSON 객체를 반환해요.
출처: 문서
본문
문법 (Syntax)
PARSE_IP(<expr>, '<type>' [, <permissive>])
인자 (Arguments)
필수 (Required):
- expr — 문자열 표현식이에요.
- type — IP 주소의 타입을 식별하는 문자열이에요. INET 또는 CIDR을 지원하며, 값은 대소문자를 구분하지 않아요.
선택 (Optional):
- permissive — 파싱 오류 처리 방식을 결정하는 플래그예요:
0으로 설정하면 파싱 오류로 함수가 실패해요.1로 설정하면 파싱 오류 시 error 필드에 해당 오류 메시지를 설정한(그 외 필드는 설정하지 않은) 객체가 생성돼요. 기본값은 0이에요.
반환 (Returns)
OBJECT.
사용 메모 (Usage notes)
- 이 함수는 IP 주소를 파싱해 JSON 객체를 반환해요. 다음 요소는 항상 반환돼요:
- family — 숫자 값. 4(IPv4) 또는 6(IPv6).
- ip_type — 문자열 값. 입력에서 온 inet 또는 cidr.
- host — 문자열 값. 입력 표현식에서의 호스트 주소.
- ip_fields — 0과 4,294,967,295 (2^32 - 1) 사이(포함)의 값을 각각 가진 숫자 필드 4개의 배열이에요. 이 배열의 비트 값은 호스트 주소의 원시 비트에 매핑돼요. 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 열에 저장하고 생성된 요소를 기준으로 조회할 것을 권장해요. 예제를 참조하세요.
예제 (Examples)
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" |
------+------------------------------------+