[英]Error extracting XML values in PostgreSQL using XPath: SQL Error [42601]: ERROR: syntax error at or near “[”
我正在尝试使用XPath从存储在PostgreSQL数据库中的XML中提取值。 我有一个错误:
SQL错误[42601]:错误:“ [”或附近的语法错误
我的SQL是:
-- Find "e" nodes which have "p1" child nodes and does not have "p3" child nodes
WITH tbl(p_xml) AS (
SELECT '<root>
<e id="1">
<p1>P1</p1>
<p2>P2</p2>
</e>
<e id="2">
<p1>P1</p1>
<p3>P2</p3>
</e>
<e id="3">
<p2>P1</p2>
<p3>P3</p3>
</e>
</root>'::xml
)
select *
FROM tbl
where
(xpath('count(/root/e/p1)', p_xml)[1]::text)::int > 0 and
(xpath('count(/root/e/p3)', p_xml)[1]::text)::int = 0
我已经在StackOverflow上看到了很多使用正方形来获取数据的示例(因为xpath函数返回数组),但是在我的PostgreSQL上,所有这些示例均因相同的错误而失败。 我在PostgreSQL数据库版本9.6和10.1上尝试过此方法,但是没有运气。
那是因为您的查询缺少方括号。 无论如何,如果您只想返回满足该条件的e
元素,则需要切碎XML,例如:
WITH tbl(p_xml) AS (
SELECT '<root>
<e id="1">
<p1>P1</p1>
<p2>P2</p2>
</e>
<e id="2">
<p1>P1</p1>
<p3>P2</p3>
</e>
<e id="3">
<p2>P1</p2>
<p3>P3</p3>
</e>
</root>'::xml
)
SELECT e
FROM tbl
CROSS JOIN LATERAL UNNEST(xpath('//e[p1 and not(p3)]', p_xml)) e
右街演示: http ://rextester.com/FZGP41665
我没有使用postgresql
经验,但这似乎可行:
where
(xpath('count(/root/e/p1)', p_xml)::text[])[1]::int > 0 and
(xpath('count(/root/e/p3)', p_xml)::text[])[1]::int = 0
看起来,好像xpath()
必须强制转换为字符串数组,在此处选择第一个元素将其int
为int
。 不是很直观。
可能有更好的方法...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.