Snowflake 中的 XML 解析

问题描述 投票:0回答:1

所以我有一个 XML 文档,它已从阶段加载到 Snowflake 中的变体列中,如下所示。

<LIST_OUTPUT>
    <RESPONSE>
        <EMP_LIST>
            <EMP>
                <ID>1</ID>
                <TYPE>PERMANENT</TYPE>
                <DOC_LIST>
                    <DOC>
                        <ID>DOC-001</ID>
                        <TYPE>PASSPORT</TYPE>
                    </DOC>
                    <DOC>
                        <ID>DOC-002</ID>
                        <TYPE>DRIVING LICENSE</TYPE>
                    </DOC>
                </DOC_LIST>
            </EMP>
            <EMP>
                <ID>2</ID>
                <TYPE>CONTRACTOR</TYPE>
                <DOC_LIST>
                    <DOC>
                        <ID>DOC-001</ID>
                        <TYPE>PASSPORT</TYPE>
                    </DOC>
                    <DOC>
                        <ID>DOC-002</ID>
                        <TYPE>DRIVING LICENSE</TYPE>
                    </DOC>
                </DOC_LIST>
            </EMP>
        </EMP_LIST>
    </RESPONSE>
</LIST_OUTPUT>

我正在尝试将其放入员工表中,所以它看起来像

emp_id emp_类型 emp_docs
1 永久 [护照、驾驶执照]
2 承包商 [护照、驾驶执照]

到目前为止我已经

select xmlget(emp.value,'ID'):"$" AS EMP_ID
       ,XMLGET(emp.value,'TYPE'):"$" AS EMP_TYPE
from raw_xml
, lateral flatten(xmlget(xmlget(xml,'RESPONSE'),'EMP_LIST'):"$") emp

但不确定如何将文档类型拉入一列。有什么指示吗?

xml snowflake-cloud-data-platform flatten
1个回答
0
投票
        select distinct  XMLGET(EMP_LIST.VALUE,'ID'):"$" :: INTEGER as EMP_ID 
,xmlget(EMP_LIST.value,'TYPE'):"$" :: string as EMP_TYPE
        
        ,array_agg( xmlget(doc.value,'TYPE'):"$"::STRING) within group(order by xmlget(doc.value,'ID'):"$" :: STRING ) over (partition by XMLGET(EMP_LIST.VALUE,'ID') ) as emp_docs_array
        
     ,listagg( xmlget(doc.value,'TYPE'):"$"::STRING,',') within group (order by xmlget(doc.value,'ID'):"$" :: STRING) over (partition by XMLGET(EMP_LIST.VALUE,'ID') )  as emp_docs_list
        
    from raw_xml
    , LATERAL FLATTEN(XMLGET(xmlget(xml,'RESPONSE'),'EMP_LIST'):"$") AS EMP_LIST 
    ,LATERAL FLATTEN(XMLGET(EMP_LIST.VALUE,'DOC_LIST'):"$") as doc

输出:


enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.