- カテゴリ:
文字列とバイナリ関数 (一般)
PARSE_IP¶
有効な INET (インターネットプロトコル)または CIDR (クラスレスインターネットドメインルーティング) 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 要素を直接クエリします。以下の例をご参照ください。
サブネットマスクを入力する場合、関数の出力を VARIANT 列に保存し、パフォーマンスを向上させるために生成された要素に対してクエリを実行することをSnowflakeはお勧めします。例をご参照ください。
例¶
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" | ------+------------------------------------+