类别:

:doc:`/sql-reference/functions-semistructured`(解析)

PARSE_XML

将输入字符串解释为 XML 文档,并生成一个 OBJECT 值。如果输入为 NULL,则输出为 NULL。

另请参阅:

CHECK_XML

语法

PARSE_XML( <string_containing_xml> [ , <disable_auto_convert> ] )
Copy
PARSE_XML( STR => <string_containing_xml>
  [ , DISABLE_AUTO_CONVERT => <disable_auto_convert> ] )
Copy

实参

必填:

string_containing_xml . OR . STR => string_containing_xml

此表达式的计算结果应为 VARCHAR。VARCHAR 应包含有效的 XML。

可选:

disable_auto_convert . OR . DISABLE_AUTO_CONVERT => disable_auto_convert

布尔表达式,用于指定函数是否应尝试将 string_containing_xml 中的数值和布尔值转换为 Snowflake 数据类型。(有关此转换的详细信息,请参阅下面的 使用说明。)

  • 如果 希望函数转换这些值,请将此实参设置为 TRUE。这样做的效果与 CREATE FILE FORMAT 中的 DISABLE_AUTO_CONVERT 参数类似。

  • 如果希望函数转换这些值,请将此实参设置为 FALSE,或省略此实参。

默认:FALSE

返回

返回值的数据类型是 OBJECT。OBJECT 包含 XML 的内部表示形式。

使用说明

  • 必须按名称或位置指定所有实参。不能按名称指定某些实参,也不能按位置指定其他实参。

    按名称指定实参时,不能在实参名称前后使用双引号。

  • XML 文档中每个元素的内容都是文本。PARSE_XML 会尝试将某些 XML 数据从文本转换为原生的 (Snowflake SQL) SQL 数据类型参考

    • NUMERIC 和 BOOLEAN:

      PARSE_XML 会尝试以某种方式将数值和布尔值显式转换为原生表示形式,在这种方式下,将这些值打印回来会产生在文本上相同的结果。例如,在解析十进制数时,PARSE_XML 会将 123.45 视为 NUMBER(5,2) 而不是 DOUBLE,以尝试保持表示形式的准确性。但是:

      • 如果数字使用科学记数法(即 1.2345e+02),或者由于范围或小数位数限制而无法存储为定点小数,它们将存储为 DOUBLE。

      • 如果 XML 元素的内容是包含小数位的数字,则 PARSE_XML 可能会截断尾随零。

      如果不希望函数执行此转换,请将 TRUE 作为 disable_auto_convert 实参传递。

    • TIMESTAMP、DATE、TIME、BINARY:

      因为 XML 未以原生方式表示 TIMESTAMP、DATE、TIME 或 BINARY 等值,所以这些值必须表示为 XML 中的字符串。PARSE_XML 不会自动识别这些值;它们作为字符串保留,因此如果需要,用户必须将这些值从字符串转换为原生的 SQL 数据类型。

  • XML 属性是名称/值对的 无序 集合。PARSE_XML 函数不一定会保留顺序。例如,如果将文本转换为 XML,然后再转换回文本,可能会产生一个包含顺序有变的原始信息的字符串。

  • 从字符串转换为 XML 时,可能会看到元素之间的空白发生变化。

示例

在以下示例中,可以看到如何使用 PARSE_XML 函数将 XML 字符串转换为可插入 OBJECT 列中的 OBJECT :

CREATE TABLE xtab (v OBJECT);

INSERT INTO xtab SELECT PARSE_XML(column1) AS v
  FROM VALUES ('<a/>'), ('<a attr="123">text</a>'), ('<a><b>X</b><b>Y</b></a>');

SELECT * FROM xtab;
Copy
+-------------------------+
|           V             |
+-------------------------+
| <a></a>                 |
| <a attr="123">text</a>  |
| <a><b>X</b><b>Y</b></a> |
+-------------------------+

以下示例演示了使用和禁用数值转换之间的区别。在此示例中,当未禁用转换时,函数会将采用科学记数法的数字解释为 DOUBLE。

SELECT PARSE_XML('<test>22257e111</test>'), PARSE_XML('<test>22257e111</test>', TRUE);
Copy
+-------------------------------------+-------------------------------------------+
| PARSE_XML('<TEST>22257E111</TEST>') | PARSE_XML('<TEST>22257E111</TEST>', TRUE) |
|-------------------------------------+-------------------------------------------|
| <test>2.225700000000000e+115</test> | <test>22257e111</test>                    |
+-------------------------------------+-------------------------------------------+

以下示例演示如何按名称指定函数的实参:

SELECT PARSE_XML(STR => '<test>22257e111</test>', DISABLE_AUTO_CONVERT => TRUE);
Copy
+--------------------------------------------------------------------------+
| PARSE_XML(STR => '<TEST>22257E111</TEST>', DISABLE_AUTO_CONVERT => TRUE) |
|--------------------------------------------------------------------------|
| <test>22257e111</test>                                                   |
+--------------------------------------------------------------------------+
语言: 中文