繁体   English   中英

使用XPath在PostgreSQL中提取XML值时出错:SQL错误[42601]:错误:“ [”或附近的语法错误

[英]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()必须强制转换为字符串数组,在此处选择第一个元素将其intint 不是很直观。

可能有更好的方法...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM