Kategorien:

Funktionen für semistrukturierte und strukturierte Daten (Extraktion)

XMLGET

Extrahiert ein XML-Elementobjekt (meist einfach als Tag bezeichnet) aus dem Inhalt des äußeren XML-Elements anhand des Namens und der Instanznummer des angegebenen Tags.

(Beachten Sie, dass ein XML-Tag nicht dasselbe ist wie ein Data Governance-Tag in Snowflake).

  • Wenn ein Argument von XMLGET NULL ist, ist das Ergebnis NULL.

  • Wenn die Tag-Instanz nicht gefunden wird, ist das Ergebnis NULL.

Syntax

XMLGET( <expression> , <tag_name> [ , <instance_number> ] )
Copy

Argumente

expression

Der Ausdruck, aus dem das Element extrahiert werden soll.

Der Ausdruck muss ein OBJECT ergeben (oder einen VARIANT-Wert, der ein OBJECT enthält). Das OBJECT muss gültige XML in dem von Snowflake unterstützten internen Format enthalten. In der Regel bedeutet das, dass OBJECT durch eine der folgenden Aktionen erstellt wurde:

  • Aufruf der Funktion PARSE_XML

  • Laden der Daten (z. B. über den Befehl COPY INTO <Tabelle>) und Angabe, dass die Daten im XML-Format vorliegen.

Die Funktion XMLGET wirkt nicht direkt auf einen VARCHAR-Ausdruck, auch wenn dieser VARCHAR gültigen XML-Text enthält.

tag_name

Der Name eines XML-Tags, der in expression gespeichert ist.

instance_number

Wenn XML mehrere Instanzen von tag_name enthält, dann verwenden Sie die Nummer der Instanz instance_number, um anzugeben, welche Instanz abgerufen werden soll. Wie ein Array-Index ist auch die instance_number 0-basiert, nicht 1-basiert.

instance_number kann weggelassen werden. In diesem Fall wird der Standardwert 0 verwendet.

Rückgabewerte

Der Datentyp des zurückgegebenen Werts ist OBJECT.

Weitere Informationen dazu finden Sie in den Nutzungshinweisen.

Nutzungshinweise

  • Das Ergebnis von XMLGET ist nicht der Inhalt des Tags (d. h. der Text zwischen den Tags), sondern das gesamte Element (das öffnende Tag, der Inhalt und das schließende Tag). Der Rückgabewert ist ein OBJECT. Aus diesem OBJECT können Sie mit der Funktion GET den Tag-Namen, die Attributwerte des Tags und den Inhalt des Elements (einschließlich verschachtelter Tags) extrahieren:

    • Verwenden Sie GET(tag, '@attrname'), um Attributwerte zu extrahieren.

    • Verwenden Sie zum Extrahieren des Inhalts GET(tag, '$').

    • Verwenden Sie GET(tag, '@'), um den Tag-Namen zu extrahieren.

  • Sie können verschachtelte Tags durch Verschachtelung von XMLGET()-Aufrufen extrahieren. Beispiel:

    select xmlget(xmlget(my_xml_column, 'my_tag'), 'my_inner_tag') ...;
    
    Copy
  • Die Positionen der inneren Tags im Inhalt können mit GET(tag, 'inner-tag-name') abgerufen werden. Wenn der Inhalt mehrere Elemente enthält, wird er als Array dargestellt.

  • Sie können XMLGET nicht dazu verwenden, das äußerste Element zu extrahieren. Um das äußerste Element zu erhalten, wählen Sie einfach den expression selbst aus.

Beispiele

Im folgenden Beispiel wird eine Tabelle mit einem OBJECT erstellt, das XML enthält, und dann wird XMLGET() verwendet, um Elemente aus diesem OBJECT zu extrahieren.

CREATE TABLE xml_demo (ID INTEGER, object_col OBJECT);
INSERT INTO xml_demo (id, object_col)
    SELECT 1001,
        PARSE_XML('<level1> 1 <level2> 2 <level3> 3A </level3> <level3> 3B </level3> </level2> </level1>');
Copy
SELECT object_col,
       XMLGET(object_col, 'level2'),
       XMLGET(XMLGET(object_col, 'level2'), 'level3', 1)
    FROM xml_demo;
+-------------------------+------------------------------+---------------------------------------------------+
| OBJECT_COL              | XMLGET(OBJECT_COL, 'LEVEL2') | XMLGET(XMLGET(OBJECT_COL, 'LEVEL2'), 'LEVEL3', 1) |
|-------------------------+------------------------------+---------------------------------------------------|
| <level1>                | <level2>                     | <level3>3B</level3>                               |
|   1                     |   2                          |                                                   |
|   <level2>              |   <level3>3A</level3>        |                                                   |
|     2                   |   <level3>3B</level3>        |                                                   |
|     <level3>3A</level3> | </level2>                    |                                                   |
|     <level3>3B</level3> |                              |                                                   |
|   </level2>             |                              |                                                   |
| </level1>               |                              |                                                   |
+-------------------------+------------------------------+---------------------------------------------------+
Copy

In diesem Beispiel wird gezeigt, wie mit GET() und XMLGET() der Inhalt eines Elements abgerufen wird. In diesem Beispiel enthält das Tag level2 drei Elemente (Text und zwei verschachtelte Tags), sodass GET diese Elemente in einem ARRAY zurückgibt. Die verschachtelten Tags werden durch OBJECTs (Schlüssel-Wert-Paare) repräsentiert. Die Eigenschaft @ enthält den Namen des verschachtelten Tags und die Eigenschaft $ enthält den Inhalt des verschachtelten Tags.

SELECT object_col,
       GET(XMLGET(object_col, 'level2'), '$')
    FROM xml_demo;
+-------------------------+----------------------------------------+
| OBJECT_COL              | GET(XMLGET(OBJECT_COL, 'LEVEL2'), '$') |
|-------------------------+----------------------------------------|
| <level1>                | [                                      |
|   1                     |   2,                                   |
|   <level2>              |   {                                    |
|     2                   |     "$": "3A",                         |
|     <level3>3A</level3> |     "@": "level3"                      |
|     <level3>3B</level3> |   },                                   |
|   </level2>             |   {                                    |
| </level1>               |     "$": "3B",                         |
|                         |     "@": "level3"                      |
|                         |   }                                    |
|                         | ]                                      |
+-------------------------+----------------------------------------+
Copy

Das folgende Beispiel zeigt, wie mit GET() und XMLGET() das Attribut eines Tags abgerufen wird:

INSERT INTO xml_demo (id, object_col)
    SELECT 1002,
        PARSE_XML('<level1> 1 <level2 an_attribute="my attribute"> 2 </level2> </level1>');
Copy
SELECT object_col,
       GET(XMLGET(object_col, 'level2'), '@an_attribute')
    FROM xml_demo
    WHERE ID = 1002;
+--------------------------------------------------+----------------------------------------------------+
| OBJECT_COL                                       | GET(XMLGET(OBJECT_COL, 'LEVEL2'), '@AN_ATTRIBUTE') |
|--------------------------------------------------+----------------------------------------------------|
| <level1>                                         | "my attribute"                                     |
|   1                                              |                                                    |
|   <level2 an_attribute="my attribute">2</level2> |                                                    |
| </level1>                                        |                                                    |
+--------------------------------------------------+----------------------------------------------------+
Copy