【发布时间】:2021-01-25 14:28:47
【问题描述】:
我有以下 XML 文件,我已将其作为 VARIANT 类型导入到雪花表中。
<xyz>
<Header>
<VersionInfo>
<Version>2.1.0</Version>
<Notes>Draft report v1</Notes>
</VersionInfo>
<Environment>Env1</Environment>
<SubID>5787685</SubID>
</Header>
<Items>
<NEWT>
<ItemNo>12345</ItemNo>
<ItemBody>
<RptDt>2021-01-19T06:54:42.483Z</RptDt>
<RptEnt>
<Entity>123</Entity>
</RptEnt>
<IsVerified>FALSE</IsVerified>
</ItemBody>
</NEWT>
</Items>
<Items>
<NEWT>
<ItemNo>23456</ItemNo>
<ItemBody>
<RptDt>2021-01-19T06:54:42.483Z</RptDt>
<RptEnt>
<Entity>2346</Entity>
</RptEnt>
<IsVerified>TRUE</IsVerified>
</ItemBody>
</NEWT>
</Items>
</xyz>
我正在尝试解析 XML 并从数据中生成两个不同的雪花表。第一个查询有效,并从该部分中提取数据。 这是查询:
-- get header and version
SELECT
XMLGET(Header.value, 'Environment'):"$"::string Environment,
XMLGET(Header.value, 'SubID'):"$"::string SubID,
XMLGET(Version.value, 'Version'):"$"::string Version,
XMLGET(Version.value, 'Notes'):"$"::string Notes
FROM
MyTable ,
LATERAL FLATTEN(GET(xml_import, '$')) Header ,
LATERAL FLATTEN(GET(Header.value, '$')) Version
WHERE
GET(Header.value, '@') = 'Header'
and GET(Version.value, '@') = 'VersionInfo';
下面是想要的结果:
ENVIRONMENT SUBID VERSION NOTES
Env1 5787685 2.1.0 Draft report v1
对于下一部分,我无法解析该部分的所有级别。所需的结果将是一个表格,其中包含来自 XML 文件中的每个数据的一行数据。
ItemNo RptDt RptEnt IsVerified
12345 2021-01-19T06:54:42.483Z 123 FALSE
23456 2021-01-19T06:54:42.483Z 2346 TRUE
我尝试编写以下 SQL,但很难过滤行和导航嵌套级别。
-- get items and reports
select
XMLGET(flt1.value, 'RptDt'):"$"::string RptDate,
XMLGET(flt1.value, 'IsVerified'):"$"::string IsVerified
FROM
MyTable src1,
lateral flatten(to_array(xmlget(xmlget(src1.xml_import, 'Items'), 'NEWT'):"$")) flt1
我确信有一种更有效的方法可以查询这些数据并将其转换为表格格式。任何人都可以建议如何遍历多个级别和多次重复,同时忽略 ?
【问题讨论】:
标签: xml xml-parsing snowflake-cloud-data-platform