- Kategorien:
Zeichenfolgen- und Binärfunktionen (Allgemein)
PARSE_IP¶
Gibt ein JSON-Objekt zurück, das aus allen Komponenten einer gültigen INET (Internet Protocol)- oder CIDR (Classless Internet Domain Routing) IPv4- bzw. IPv6-Zeichenfolge besteht.
Syntax¶
PARSE_IP(<expr>, '<type>' [, <permissive>])
Argumente¶
Benötigt:
expr
Ein Zeichenfolgenausdruck.
type
Eine Zeichenfolge, die den Typ der IP-Adresse angibt. Unterstützt entweder
INET
oderCIDR
. Groß-/Kleinschreibung wird nicht unterschieden.
Optional:
permissive
Flag, das darüber bestimmt, wie Analysefehler behandelt werden:
Bei Auswahl von 0 führen Fehler bei der Analyse dazu, dass die Funktion fehlschlägt.
Bei Auswahl von 1 wird bei Analysefehlern ein Objekt erzeugt, in dem das Feld
error
auf die entsprechende Fehlermeldung (und keine anderen Felder) gesetzt ist.
Der Standardwert ist 0.
Rückgabewerte¶
Nutzungshinweise¶
Die Funktion analysiert eine IP-Adresse und gibt ein JSON-Objekt zurück.
Folgende Elemente werden immer zurückgegeben:
family
Numerischer Wert.
4
(IPv4) oder6
(IPv6).ip_type
Zeichenfolgenwert.
inet
odercidr
aus der Eingabe.host
Zeichenfolgenwert. Hostadresse aus dem Eingabeausdruck.
ip_fields
Array aus 4 numerischen Feldern, jeweils mit einem Wert zwischen 0 und 4.294.967.295 (2^32 - 1), einschließlich. Die Bitwerte aus diesem Array werden den Rohbits der Hostadresse zugeordnet.
IPv4-Adressen: Zeigen nur die 32 Bits der Hostadresse ganz rechts an.
IPv6-Adressen: Zeigen von links nach rechts jedes der 32-Bit-Felder an, die den Rohwerten der 128-Bit-Hostadresse zugeordnet sind.
Wenn eine Subnetzmaske eingegeben wird, enthält das Ergebnis
network_prefix_length
, einen numerischen Wert, der die Länge der Subnetzmaske angibt.Folgende Elemente werden bei IPv4-Adressen zurückgegeben:
ipv4
Numerische IP-Adresse, die mit dem ersten Feld in
ip_fields
übereinstimmt.ipv4_range_start
Numerische Startadresse des Netzwerks; wird angezeigt, wenn eine Subnetzmaske in die Eingabe aufgenommen wird.
ipv4_range_end
Numerische Endadresse des Netzwerks; wird angezeigt, wenn eine Subnetzmaske in die Eingabe aufgenommen wird.
Folgende Elemente werden bei IPv6-Adressen zurückgegeben:
hex_ipv6
IP-Adresse, ausgedrückt als vollständig aufgefüllter Hexadezimalwert fester Größe.
hex_ipv6_range_start
Vollständig aufgefüllte hexadezimale Startadresse fester Größe des Netzwerks; wird angezeigt, wenn eine Subnetzmaske in die Eingabe aufgenommen wird.
hex_ipv6_range_end
Vollständig aufgefüllte hexadezimale Endadresse fester Größe des Netzwerks, die angezeigt wird, wenn eine Subnetzmaske in die Eingabe aufgenommen wird.
Das Element
snowflake$type
ist für die interne Verwendung von Snowflake reserviert.Fragen Sie zur Berechnung von IP-Adressen oder Suche nach Subnetzmasken die einzelnen JSON-Elemente direkt ab. Siehe die Beispiele unten.
Bei Eingabe einer Subnetzmaske empfehlen wir, die Funktionsausgabe in einer VARIANT-Spalte zu speichern und die generierten Elemente abzufragen, um eine bessere Leistung zu erzielen. Siehe Beispiele.
Beispiele¶
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" | ------+------------------------------------+