PostgreSQL中合并同名XML节点值至单个字段的实现方法
解决方案:提取XML多节点并合并字段值
核心思路是先通过XMLTABLE提取所有目标节点的字段值,再用PostgreSQL的STRING_AGG函数将同组的字段值用指定分隔符合并。
步骤1:提取所有节点数据
修改XMLTABLE的路径表达式,去掉原有的[1]限制,这样会遍历所有<rodzaj-wsparcia>节点,提取每个节点对应的日期字段。
步骤2:合并字段值
用STRING_AGG函数对提取出的多个日期值进行分组拼接,分隔符使用|。
完整代码示例
假设你的表名为your_table,包含主键id和存储XML数据的字段xml_data:
SELECT t.id, -- 合并所有开始日期 STRING_AGG(x.start_date::TEXT, ' | ') AS merged_start_dates, -- 合并所有结束日期 STRING_AGG(x.end_date::TEXT, ' | ') AS merged_end_dates FROM your_table t, XMLTABLE('/dane/rodzaj-wsparcia' PASSING t.xml_data COLUMNS start_date DATE PATH 'control-rozpoczecie-wsparcia', end_date DATE PATH 'control-zakonczenie-wsparcia' ) x GROUP BY t.id;
单条XML测试示例
如果只是测试单条XML数据,可以直接传入XML字符串:
SELECT STRING_AGG(x.start_date::TEXT, ' | ') AS merged_start_dates, STRING_AGG(x.end_date::TEXT, ' | ') AS merged_end_dates FROM XMLTABLE('/dane/rodzaj-wsparcia' PASSING '<dane> <rodzaj-wsparcia> <control-rozpoczecie-wsparcia>2022-11-19</control-rozpoczecie-wsparcia> <control-zakonczenie-wsparcia>2023-01-05</control-zakonczenie-wsparcia> </rodzaj-wsparcia> <rodzaj-wsparcia> <control-rozpoczecie-wsparcia>2022-11-15</control-rozpoczecie-wsparcia> <control-zakonczenie-wsparcia>2023-02-10</control-zakonczenie-wsparcia> </rodzaj-wsparcia> </dane>'::XML COLUMNS start_date DATE PATH 'control-rozpoczecie-wsparcia', end_date DATE PATH 'control-zakonczenie-wsparcia' ) x;
可选:指定合并顺序
如果需要按日期排序后再合并,可在STRING_AGG中添加ORDER BY:
STRING_AGG(x.start_date::TEXT, ' | ' ORDER BY x.start_date) AS merged_start_dates
内容的提问来源于stack exchange,提问作者mtmx
相关产品推荐
相关产品推荐

