类别:

半结构化和结构化数据函数 (提取)

XMLGET

根据指定标签的名称和实例编号,从外部 XML 元素的内容中提取 XML 元素对象(通常简称为 标签)。

(请注意,XML 标签与 Snowflake 数据治理标签 不同。

  • 如果 XMLGET 的任何实参为 NULL,则结果为 NULL。

  • 如果未找到标签实例,则结果为 NULL。

语法

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

实参

expression

要从中提取元素的表达式。

表达式的计算结果必须为 OBJECT (或包含 OBJECT 的 VARIANT)。OBJECT 必须包含 Snowflake 支持的内部格式的有效 XML。通常,这意味着 OBJECT 由以下之一生成:

XMLGET 函数不会直接对 VARCHAR 表达式进行操作,即使 VARCHAR 包含有效的 XML 文本也是如此。

tag_name

存储在 XML 中的 expression 标签的名称。

instance_number

如果 XML 包含 tag_name 的多个实例,则使用 instance_number 指定要检索的实例。与数组索引一样,instance_number 从 0 开始,而不是从 1 开始。

instance_number 可以省略,在这种情况下,使用默认值 0。

返回

返回值的数据类型是 OBJECT

有关更多详细信息,请参阅使用说明。

使用说明

  • XMLGET 的结果不是标签的内容(即标签之间的文本),而是整个元素(开始标签、内容和结束标签)。返回值为 OBJECT。从此 OBJECT 中,可以使用 GET 函数提取标签名称、标签的属性值以及元素的内容(包括嵌套标签):

    • 要提取属性值,请使用 GET(tag, '@attrname')

    • 要提取内容,请使用 GET(tag, '$')

    • 要提取标签名称,请使用 GET(tag, '@')

  • 您可以通过嵌套 XMLGET() 调用来提取嵌套标签,例如:

    select xmlget(xmlget(my_xml_column, 'my_tag'), 'my_inner_tag') ...;
    
    Copy
  • 可以使用 GET(tag, 'inner-tag-name') 获取内容中内部标签的位置;如果内容包含多个元素,则位置将表示为数组。

  • 您不能使用 XMLGET 来提取最外层元素。要获取最外层元素,只需选择 expression 本身。

示例

以下示例创建了一个具有包含 XML 的 OBJECT 的表,然后使用 XMLGET() 从该 OBJECT 中提取元素。

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

此示例演示了如何将 GET() 与 XMLGET() 结合使用来检索元素的内容。在此示例中,level2 标签包含三个项目(文本和两个嵌套标签),因此 GET 以 ARRAY 形式返回这些项目。嵌套标签由 OBJECTs(键值对)表示。@ 属性包含嵌套标签名称,$ 属性包含嵌套标签内容。

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

此示例演示了如何将 GET() 与 XMLGET() 结合使用来检索标签的属性:

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
语言: 中文