类别:

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

XMLGET

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

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

另请参阅:

CHECK_XMLPARSE_XMLTO_XML

语法

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

在以下情况下,该函数会返回 NULL:

  • 如果 XMLGET 的任何实参是 NULL。

  • 如果找不到标签实例。

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

使用说明

  • XMLGET 的结果不是标签的内容(即标签之间的文本),而是整个元素(开始标签、内容和结束标签)。从返回的 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 OR REPLACE 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;
Copy
+-------------------------+------------------------------+---------------------------------------------------+
| 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>               |                              |                                                   |
+-------------------------+------------------------------+---------------------------------------------------+

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

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

此示例演示了如何将 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') AS attribute
  FROM xml_demo
  WHERE ID = 1002;
Copy
+--------------------------------------------------+----------------+
| OBJECT_COL                                       | ATTRIBUTE      |
|--------------------------------------------------+----------------|
| <level1>                                         | "my attribute" |
|   1                                              |                |
|   <level2 an_attribute="my attribute">2</level2> |                |
| </level1>                                        |                |
+--------------------------------------------------+----------------+

备注

有关使用 XMLGET 函数的查询的更多示例,请参阅 处理 XML 的示例

语言: 中文