Snowflake查询XML节点属性返回null的解决方法
Snowflake XML节点属性读取返回null问题修复方案
问题根因
属性读取返回null是因为XMLGET()函数的设计用途是提取当前节点下的子元素节点,不支持读取节点自身挂载的属性。你之前传入@date、@reseller-id作为XMLGET的参数时,函数会尝试查找标签名为@date的子元素,这类节点不存在自然返回null。
其余子节点字段能正常返回,是因为你用XMLGET读取transaction下嵌套子标签的写法本身是正确的。
正确实现代码
Snowflake中XML节点的自身属性统一存储在节点对象的@字段下,直接通过路径引用即可读取,无需调用XMLGET,修正后的完整SQL如下:
SELECT retail.value:"@"."date"::STRING as "Transaction Date", retail.value:"@"."reseller-id"::STRING as "Reseller ID", XMLGET( retail.value, 'transactionid' ):"$"::STRING as "Transaction ID", XMLGET( retail.value, 'eventName' ):"$"::STRING as "Event Name", XMLGET( retail.value, 'numberOfPurchasedTickets' ):"$"::NUMBER as "Number of Purchased Tickets", XMLGET( retail.value, 'totalAmount' ):"$"::NUMBER as "Total Amount", XMLGET( retail.value, 'salesChannel' ):"$"::STRING as "Sales Channel", XMLGET( retail.value, 'officeLocation' ):"$"::STRING as "Office Location", XMLGET( retail.value, 'dateCreated' ):"$"::STRING as "Date Created", XMLGET( customer.value, 'firstName' ):"$"::STRING as "First Name", XMLGET( customer.value, 'lastName' ):"$"::STRING as "Last Name" FROM stage_thirdparty retail_xml, LATERAL FLATTEN(to_array(retail_xml.src_xml:"$" )) retail, LATERAL FLATTEN(to_array(retail.value:"$" )) customer where GET( customer.value, '@') = 'customer' ;
语法说明
- 读取节点自身属性:统一使用
节点引用:"@"."属性名"格式,属性名带横杠等特殊字符时也可以正常解析 - 读取子节点内容:保持原有
XMLGET(父节点引用, '子节点标签名'):"$"写法即可 - 取值后建议显式添加
::目标数据类型做类型转换,避免返回VARIANT类型影响后续计算、导出操作
内容的提问来源于stack exchange,提问作者Scott Wood
相关产品推荐
相关产品推荐

