- 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> ] )
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 Instanzinstance_number
, um anzugeben, welche Instanz abgerufen werden soll. Wie ein Array-Index ist auch dieinstance_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') ...;
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>');
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> | | |
+-------------------------+------------------------------+---------------------------------------------------+
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" |
| | } |
| | ] |
+-------------------------+----------------------------------------+
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>');
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> | |
+--------------------------------------------------+----------------------------------------------------+