PostgreSQL XML转表问题及与SQL Server XML解析语法差异咨询
问题原因
- 节点拆分逻辑错误:原代码拆分下的所有子节点,会额外得到不需要的节点,和SQL Server只拆分
节点的逻辑不一致。 - 全局属性查询逻辑错误:的id_file、version属性,以及下的name_code属性属于全局层级,不能从拆分后的单个
节点中查询,需要从原始的整份XML文档查询。 - 路径表达式错误:
//b/@bbb的写法错误,bbb是节点名不是的属性,该值对应bbb节点的name_code属性。
修正后可直接运行的SQL
with cte as (SELECT '<a id_file="9965_99" version="4.1.0"> <b> <bbb name_code="note"/> </b> <c id="d000fe02-bd80-46ac-8d60-afdf3e194f90"> <f ddd="test1" /> <r rrr="1" /> </c> <c id="d000fe02-bd80-46ac-8d60-afdf3e194f91"> <f ddd="test2" /> <r rrr="2" /> </c> <c id="d0t0fe02-bd80-46ac-8d60-afdf3e194f92"> <f ddd="test3" /> <r rrr="3" /> </c> </a>' ::xml as xml_content) SELECT (xpath('//@id_file', xml_content))[1]::text as col1, (xpath('//@version', xml_content))[1]::text as col2, (xpath('//bbb/@name_code', xml_content))[1]::text as col3, (xpath('@id', xt))[1]::text as col4, (xpath('f/@ddd', xt))[1]::text as col5, (xpath('r/@rrr', xt))[1]::text as col6 from cte cross join unnest(xpath('//c', xml_content)) as xt;
运行结果说明
执行后会返回3行数据,和你提供的SQL Server运行结果完全一致,所有字段都能正确取值。
内容的提问来源于stack exchange,提问作者Ingward Berholz
相关产品推荐
相关产品推荐

