PostgreSQL中如何使用XPath获取XML多个子元素的名称
问题原因
你之前的两种写法都不符合PostgreSQL对XPath函数的调用逻辑:
- 第一种写法中,
xpath('name()', 节点)没有指定上下文节点,无法正确识别要取名称的目标,所以返回空结果。 - 第二种写法中,XPath的
name()函数传入节点集时,默认只会处理节点集的第一个元素,因此只能拿到第一个子节点bar的名称。
正确实现方式
方法1:兼容所有版本PostgreSQL的写法
先拆分/foo下的所有子节点,再对每个节点单独取名称:
SELECT (xpath('name(.)', node))[1]::text AS tag_name FROM unnest(xpath('/foo/*', '<foo><bar>test</bar><zar>test1</zar></foo>')) AS node;
执行后会返回两行结果,分别为bar、zar。
方法2:PostgreSQL 10+ 更简洁的XMLTABLE写法
SELECT tag_name FROM XMLTABLE( '/foo/*' PASSING '<foo><bar>test</bar><zar>test1</zar></foo>' COLUMNS tag_name text PATH 'name()' );
内容的提问来源于stack exchange,提问作者bharathp
相关产品推荐
相关产品推荐

