我正在使用 Snowflake 解析 XML 文件。
XML 示例:
<?xml version="1.0" encoding="utf-8"?>
<projet num_PEBN="{BCB1FA53-CE80-4357-9AE5-A672323C648A}" version="1.1.0.3" referentiel_ec="2">
<R version="1.0.1.3" phase="5">
<ent>
<batiment>
<index>1</index>
<nom>Bâtiment B2</nom>
<zone>
<index>1</index>
<usage>16</usage>
<sdp>8459.00</sdp>
<contributeur ref="1">
<lot ref="1">
<sous_lot ref="1">
<data>
<id_fiche>13751</id_fiche>
<id_base>0</id_base>
<id_produit>INIES_DGA</id_produit>
<nom>Gaines</nom>
<unite_uf>12</unite_uf>
<quantite>205.38217</quantite>
<dve>50</dve>
<type_donnees>3</type_donnees>
</data>
</sous_lot>
</lot>
<lot ref="2">
<data>
<id_fiche>13752</id_fiche>
<id_base>1</id_base>
<id_produit>INIES</id_produit>
<nom>Fourreaux</nom>
<unite_uf>11</unite_uf>
<quantite>205.17</quantite>
<dve>50</dve>
<type_donnees>3</type_donnees>
</data>
</lot>
</contributeur>
</zone>
</batiment>
</ent>
</R>
</projet>
当您可以拥有不同的分层“级别”时,创建收集“数据”属性值的某些值的视图的最佳方法是什么?
现在,我在 2 个不同的请求上使用 UNION,对于第二种情况,“sous_lot”引用设置为 NULL:
//CREATE OR REPLACE VIEW MyView as
(SELECT XMLGET(bat.value,'index'):"$"::int as bat_index,
XMLGET(bat.value, 'nom'):"$"::string as nom_batiment,
XMLGET(zone.value,'index'):"$"::int as zone_index,
XMLGET(zone.value,'usage'):"$"::int as zone_usage,
GET(contributeur.value, '@ref')::int as contributeur_ref,
GET(lot.value, '@ref')::int as lot_ref,
GET(sous_lot.value, '@ref')::int as sous_lot_ref,
XMLGET(data.value,'id_base'):"$"::int as id_base
FROM FicTable as xml_table,
LATERAL FLATTEN(to_array(XMLGET(XMLGET(xml_table.C1,'R'), 'ent'):"$")) bat,
LATERAL FLATTEN(to_array(bat.value:"$")) zone,
LATERAL FLATTEN(to_array(zone.value:"$")) contributeur,
LATERAL FLATTEN(to_array(contributeur.value:"$")) lot,
LATERAL FLATTEN(to_array(lot.value:"$")) sous_lot,
LATERAL FLATTEN(to_array(sous_lot.value:"$")) data
WHERE GET(bat.value, '@') = 'batiment'
AND GET(zone.value, '@') = 'zone'
AND GET(contributeur.value, '@') = 'contributeur'
AND GET(lot.value, '@') = 'lot'
AND GET(sous_lot.value, '@') = 'sous_lot'
AND GET(data.value, '@') = 'data')
UNION
(SELECT XMLGET(bat.value,'index'):"$"::int as bat_index,
XMLGET(bat.value, 'nom'):"$"::string as nom_batiment,
XMLGET(zone.value,'index'):"$"::int as zone_index,
XMLGET(zone.value,'usage'):"$"::int as zone_usage,
GET(contributeur.value, '@ref')::int as contributeur_ref,
GET(lot.value, '@ref')::int as lot_ref,
NULL as sous_lot_ref,
XMLGET(data.value,'id_base'):"$"::int as id_base
FROM FicTable as xml_table,
LATERAL FLATTEN(to_array(XMLGET(XMLGET(xml_table.C1,'R'), 'ent'):"$")) bat,
LATERAL FLATTEN(to_array(bat.value:"$")) zone,
LATERAL FLATTEN(to_array(zone.value:"$")) contributeur,
LATERAL FLATTEN(to_array(contributeur.value:"$")) lot,
LATERAL FLATTEN(to_array(lot.value:"$")) data
WHERE GET(bat.value, '@') = 'batiment'
AND GET(zone.value, '@') = 'zone'
AND GET(contributeur.value, '@') = 'contributeur'
AND GET(lot.value, '@') = 'lot'
AND GET(data.value, '@') = 'data');
我想有一种更好的方法可以做到这一点,也许只需要一个请求。
预先感谢您的帮助。