如何将XML字符串按不同Contract_key拆分为多组关联数据?
提取XML列中所有Contract数据的正确方法
你之前用split_part和strpos只能抓取第一个Contract的问题,核心原因是字符串拆分逻辑无法处理重复节点,直接使用XML解析函数就能搞定所有Contract的提取需求。
假设你使用的是PostgreSQL(支持XML解析功能),以下是修正后的查询代码:
SELECT aee.application_id, x.contract_key, x.outstanding_amount_r, x.average_monthly_instalment_amount FROM stage_lt.cb_data_execution_entry_details deed JOIN stage_lt.cb_data_execution_entry dee ON deed.execution_entry_id = dee.id JOIN stage_lt.cb_application_to_execution_entry aee ON aee.execution_entry_id = deed.execution_entry_id -- 将转义的XML字符串转换为可解析的XML类型,遍历所有Contract节点 CROSS JOIN xmltable( '/Root/Contracts/Contract' -- 请替换为你实际XML结构中的Contract节点路径 PASSING xml(decode(dee.response_body, 'HTML')) COLUMNS contract_key TEXT PATH '@key', outstanding_amount_r NUMERIC PATH 'OutstandingAmountR', average_monthly_instalment_amount NUMERIC PATH 'AverageMonthlyInstalmentAmount' ) x WHERE dee.provider_name = 'cb' AND aee.application_id = '2253545';
关键说明:
- 用XML解析替代字符串拆分:
xmltable函数会自动遍历XML中所有匹配的Contract节点,每个节点生成一行数据,完美解决多Contract提取的问题。 - 处理转义字符:你的
response_body中存在<、"这类HTML转义符,必须通过decode(..., 'HTML')转换为正常的XML标签和引号,否则XML解析会报错。 - 调整节点路径:
/Root/Contracts/Contract是示例路径,需要根据你实际的XML结构进行修改(比如Contract直接在根节点下,就写/Contract)。
原方法仅能获取首个Contract的原因:
split_part只会返回第一个分隔符后的内容,无法识别后续存在的其他Contract节点,因此只能拿到第一组匹配数据。而XML解析是从结构层面处理数据,能完整遍历所有重复节点。
内容的提问来源于stack exchange,提问作者Nickname_used
相关产品推荐
相关产品推荐

