【问题标题】:PostgreSQL11 xpath query not working properlyPostgreSQL11 xpath 查询无法正常工作
【发布时间】:2020-04-16 21:13:03
【问题描述】:

当我在 Postgres 10.12 中执行以下查询时,它可以正常工作。

SELECT (xpath('./sid/text()', c.node))[1]::text::bigint AS STUDENT_ID,
       (xpath('./name/text()', c.node))[1]::text AS STUDENT_NAME
from (    
  select unnest(xpath('/data', '<data><sid>112233</sid><name>John</name></data>'::xml)) AS node    
) c;

输出:

但是当我在 Postgres 11.7 中执行相同的查询时,它不起作用。

有什么办法可以解决这个问题?

【问题讨论】:

    标签: sql postgresql xpath postgresql-10 postgresql-11


    【解决方案1】:

    这是由change引起的:

    正确处理 xmltable()、xpath() 和其他 XML 处理函数中的相对路径表达式 (Markus Winand)

    根据 SQL 标准,相对路径从 XML 输入文档的文档节点开始,而不是像这些函数以前那样从根节点开始。

    所以你需要把它改成:

    SELECT (xpath('/data/sid/text()', c.node))[1]::text::bigint AS STUDENT_ID,
           (xpath('/data/name/text()', c.node))[1]::text AS STUDENT_NAME
    from (    
      select unnest(xpath('/data', '<data><sid>112233</sid><name>John</name></data>'::xml)) AS node    
    ) c;
    

    因为内部的xpath 也会返回&lt;data&gt; 标签:

    select unnest(xpath('/data', '<data><sid>112233</sid><name>John</name></data>'::xml)) AS node
    

    结果:

    <data>
      <sid>112233</sid>
      <name>John</name>
    </data>
    

    但是,我会为此使用 xmltable:

    select *
    from xmltable('/data'
                   passing xml('<data><sid>112233</sid><name>John</name></data>')
                   columns 
                      student_id bigint path 'sid', 
                      student_name text path 'name')
    

    【讨论】:

    • 小提琴演示了pg10pg11+ 的两种行为
    • 谢谢@a_horse_with_no_name,这个解决方案对我有用。感谢您建议使用 xmltable 使用正确的查询。
    猜你喜欢
    • 2011-12-22
    • 2013-12-09
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多