让我们说我正在使用此
解析XMLSELECT xpath('/id/text()', '<id>45687</id>'::xml);
输出将是
xpath
-------
{45687}
如果没有花括号高效,我如何输出?有效地,我的意思是不必使用像
这样的regexp_replace()函数SELECT regexp_replace(xpath('/id/text()', '<id>45687</id>'::xml)::text, '[{}]', '', 'g');
答案 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[]);