【问题标题】:Querying XML that has nested tags through Snowflake UI通过 Snowflake UI 查询具有嵌套标签的 XML
【发布时间】:2021-06-27 14:45:42
【问题描述】:

我正在尝试使用 Snowflake 中的横向展平功能查询包含嵌套标记的 XML。我无法遍历并获得所需格式的结果。

表 EMP_XML 有一个变体列 SRC_XML,其中包含以下 XML 值 -

<DATALOAD>
<HEADER>
    <RECDATE>
        <START>2021-03-02</START>
        <END>2021-03-02</END>
    </RECDATE>
    <EMP_DETAILS>
        <EMPLOYEE>
            <EMP_ID>123</EMP_ID>
            <EMP_NAME>ABC</EMP_NAME>
            <EMP_ADDR>DETROIT</EMP_ADDR>
        </EMPLOYEE>
        <EMPLOYEE>
            <EMP_ID>456</EMP_ID>
            <EMP_NAME>XYZ</EMP_NAME>
            <EMP_ADDR>RICHMOND</EMP_ADDR>
        </EMPLOYEE>
    </EMP_DETAILS>  
</HEADER>   

执行以下查询时,未获取任何结果。

 select
       XMLGET( SRC_XML, '@EMP_ID' ):"$"::string AS EMP_ID
     , XMLGET( SRC_XML, '@EMP_NAME' ):"$"::string AS EMP_NAME
     , XMLGET( emp.value, '@EMP_ADDR' ):"$"::string as EMP_ADDR
from
    EMP_XML
    ,  lateral FLATTEN(EMP_XML.SRC_XML:"$") emp
  where emp.value like '<employee>%'

您能帮我如何显示子标签值吗?

【问题讨论】:

    标签: xml snowflake-cloud-data-platform snowflake-schema


    【解决方案1】:

    创建样本数据:

    CREATE OR REPLACE TABLE EMP_XML AS
    SELECT
    '<DATALOAD>
    <HEADER>
        <RECDATE>
            <START>2021-03-02</START>
            <END>2021-03-02</END>
        </RECDATE>
        <EMP_DETAILS>
            <EMPLOYEE>
                <EMP_ID>123</EMP_ID>
                <EMP_NAME>ABC</EMP_NAME>
                <EMP_ADDR>DETROIT</EMP_ADDR>
            </EMPLOYEE>
            <EMPLOYEE>
                <EMP_ID>456</EMP_ID>
                <EMP_NAME>XYZ</EMP_NAME>
                <EMP_ADDR>RICHMOND</EMP_ADDR>
            </EMPLOYEE>
        </EMP_DETAILS>  
    </HEADER>
    </DATALOAD>'::VARIANT AS SRC_XML;
    

    查询(这里的重点是PARSE_XML):

    SELECT 
          XMLGET(empd.value, 'EMP_ID'):"$"::STRING   AS EMP_ID
         ,XMLGET(empd.value, 'EMP_NAME'):"$"::STRING AS EMP_NAME
         ,XMLGET(empd.value, 'EMP_ADDR'):"$"::STRING AS EMP_ADDR
    FROM EMP_XML e
    , LATERAL (SELECT PARSE_XML(e.SRC_XML) src_xml) p
    , LATERAL FLATTEN(GET(p.SRC_XML, '$'):"$") emp
    , LATERAL FLATTEN(emp.value:"$") empd
    WHERE empd.value LIKE '<EMPLOYEE>%';
    

    输出:

    +-----+--------+----------+----------+
    | Row | EMP_ID | EMP_NAME | EMP_ADDR |
    +-----+--------+----------+----------+
    |   1 |    123 | ABC      | DETROIT  |
    |   2 |    456 | XYZ      | RICHMOND |
    +-----+--------+----------+----------+
    

    【讨论】:

    • 当按照您建议的方式将 XML 加载到表中时,上述解决方案正在运行。在表格中,我在每个新行之后看到 \n 个字符,但在我的表格中,我没有看到 \n。当我执行SELECT * FROM EMP_XML e , LATERAL (SELECT PARSE_XML(e.SRC_XML) src_xml) p , LATERAL FLATTEN(GET(p.SRC_XML, '$'):"$") emp 时,查询没有返回任何行
    猜你喜欢
    • 2021-02-04
    • 2023-03-06
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    相关资源
    最近更新 更多