从Postgres中的xpath输出中删除花括号

时间:2014-09-04 22:08:48

标签: xml postgresql

让我们说我正在使用此

解析XML
SELECT xpath('/id/text()', '<id>45687</id>'::xml);

输出将是

xpath
-------
{45687}

如果没有花括号高效,我如何输出?有效地,我的意思是不必使用像

这样的regexp_replace()函数
SELECT regexp_replace(xpath('/id/text()', '<id>45687</id>'::xml)::text, '[{}]', '', 'g');

2 个答案:

答案 0 :(得分:9)

xpath()没有返回字符串,它会返回xml[]。花括号是数组表示法的一部分,而不是数据的一部分 - 您自己使用text强制转换添加它们。

对于固定大小的数组,您可以通过索引拉出元素:

SELECT (xpath('/id/text()', '<id>45687</id>'::xml))[1]

将此推广为任意数量的元素,您可以执行以下操作:

SELECT string_agg(x::text, ',')
FROM unnest(xpath('/id/text()', '<id>45687</id>'::xml)) u(x)

虽然这可能不比原始版本更有效。通过字符串操作执行此操作的最简单方法可能是

SELECT btrim(xpath('/id/text()', '<id>45687</id>'::xml)::text, '{}')

答案 1 :(得分:1)

我想我发现了一种似乎更好的方法。由于xpath在Postgres中返回看起来像数组结果的内容,我只是将xpath输出到数组并使用unnest来提取该值。 xpath用大括号输出值是有意义的,因为可能有很多我从中提取的元素实例。所以另一种方法是

SELECT unnest(xpath('/id/text()', '<id>45687</id>'::xml)::varchar[]);