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:

Ausdruck

Ein Zeichenfolgenausdruck.

Typ

Eine Zeichenfolge, die den Typ der IP-Adresse angibt. Unterstützt entweder INET oder CIDR. Groß-/Kleinschreibung wird nicht unterschieden.

Optional:

Permissiv

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

OBJECT.

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) oder 6 (IPv6).

    ip_type

    Zeichenfolgenwert. inet oder cidr 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: Zeigt nur die 32 Bits der Hostadresse ganz rechts an.

    • IPv6-Adressen: Zeigt von links nach rechts jedes der 32-Bit-Felder an, die der rohen 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"    |
------+------------------------------------+