从嵌套XML PostgreSQL中提取数据
我有一个需要插入到表中的XML。XML看起来像从嵌套XML PostgreSQL中提取数据,sql,xml,postgresql,postgresql-9.5,Sql,Xml,Postgresql,Postgresql 9.5,我有一个需要插入到表中的XML。XML看起来像 <?xml version="1.0" encoding="UTF-8"?> <root> <pats> <pat> <id>1</id> <pat_maps> <pat_map> <pgid>1
<?xml version="1.0" encoding="UTF-8"?>
<root>
<pats>
<pat>
<id>1</id>
<pat_maps>
<pat_map>
<pgid>100</pgid>
<pgname>test</pgname>
</pat_map>
<pat_map>
<pgid>101</pgid>
<pgname>test1</pgname>
</pat_map>
</pat_maps>
</pat>
<pat>
<id>2</id>
<pat_maps>
<pat_map>
<pgid>102</pgid>
<pgname>test2</pgname>
</pat_map>
</pat_maps>
</pat>
<pat>
<id>3</id>
<pat_maps>
<pat_map>
<pgid>104</pgid>
<pgname>test6</pgname>
</pat_map>
<pat_map>
<pgid>105</pgid>
<pgname>test7</pgname>
</pat_map>
</pat_maps>
</pat>
</pats>
</root>
已在下面尝试,但正在应用交叉联接
with x(t) as (select '<?xml version="1.0" encoding="UTF-8"?>
<root>
<pats>
..............
..........
</pat>
</pats>
</root>'::xml AS t
)
, base_id as (SELECT
unnest(xpath('/root/pats/pat/id/text()', t)) AS id
from x
), nested_rec as ( select
unnest(xpath('pgid/text()', cat_assn_list)) AS pgid,
unnest(xpath('pgname/text()', cat_assn_list)) AS pgname
from (select unnest(xpath('/root/pats/pat/pat_maps/pat_map', t)) cat_assn_list from x) q
)
select base_id.*,nested_rec.* from base_id,nested_rec;
******* output *********
ID PGID PGNAME
"1" "100" "test"
"1" "101" "test1"
"1" "102" "test2"
"1" "104" "test6"
"1" "105" "test7"
"2" "100" "test"
"2" "101" "test1"
"2" "102" "test2"
"2" "104" "test6"
"2" "105" "test7"
"3" "100" "test"
"3" "101" "test1"
"3" "102" "test2"
"3" "104" "test6"
"3" "105" "test7"
我还没有找到一种方法,如何嵌套XML ID并准备结果集?。
在PostgreSQL中是否有其他方法可以将xml数据转换为表而不使用XPath函数?
提前感谢。以下内容满足您的要求,并且略短一些:
select (xpath('/pat/id/text()', d.pat))[1]::text::int as id,
(xpath('/pat_map/pgid/text()', m.map))[1]::text::int as pgid,
(xpath('/pat_map/pgname/text()', m.map))[1]::text as pgname
from x
cross join unnest(xpath('/root/pats/pat', x.t)) as d(pat)
cross join unnest(xpath('/pat/pat_maps/pat_map', d.pat)) as m(map)
;
使用更现代的Postgres版本,您可以使用xmltable:
XPATH是一种方法,但我不理解您的问题。嵌套XML或准备结果集是什么意思?为什么不直接插入结果?@LaurenzAlbe嵌套XML ID并准备结果集意味着在XML中迭代ID元素并准备PGID和PGNAME子元素数据。你能检查一下这一部分吗?我想在描述中以以下方式插入数据,这就是我需要最终结果的方式,但它在Postgres 9.5版本中不起作用@马赫什:啊,9.5需要一条绝对路径。查看我的编辑
select (xpath('/pat/id/text()', d.pat))[1]::text::int as id,
(xpath('/pat_map/pgid/text()', m.map))[1]::text::int as pgid,
(xpath('/pat_map/pgname/text()', m.map))[1]::text as pgname
from x
cross join unnest(xpath('/root/pats/pat', x.t)) as d(pat)
cross join unnest(xpath('/pat/pat_maps/pat_map', d.pat)) as m(map)
;
select d.*
from x
cross join xmltable ('/root/pats/pat/pat_maps/pat_map'
passing t
columns
id integer path '../../id',
pgid integer path 'pgid',
pgname text path 'pgname') as d