【问题标题】:How to display author titles that start with K如何显示以 K 开头的作者标题
【发布时间】:2025-12-02 14:05:01
【问题描述】:

我有一个存储这些文档的表。我想显示名字以 K 开头的作者的标题。我的讲师没有为我通过这个作业,怎么了?

SELECT XPATH('/bookstore/book[author = ".*\ K.*"]/title/text()',data) FROM bookstore;
<bookstore>

<book category="cooking">
  <title lang="en">Everyday Italian</title>
  <author>Giada De Laurentiis</author>
  <year>2005</year>
  <price>30.00</price>
</book>

<book category="children">
  <title lang="en">Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

<book category="web">
  <title lang="en">XQuery Kick Start</title>
  <author>James McGovern</author>
  <author>Per Bothner</author>
  <author>Kurt Cagle</author>
  <author>James Linn</author>
  <author>Vaidyanathan Nagarajan</author>
  <year>2003</year>
  <price>49.99</price>
</book>

<book category="web">
  <title lang="en">Learning XML</title>
  <author>Erik T. Ray</author>
  <year>2003</year>
  <price>39.95</price>
</book>

</bookstore>

【问题讨论】:

    标签: sql xml postgresql xpath


    【解决方案1】:

    我假设您没有通过,因为您的查询没有返回任何内容。您的 xpath 表达式返回一个空数组。主要原因是, xpath() 不支持正则表达式(据我所知,这是您正在尝试做的事情)。要在开头测试字符,您需要使用starts-with()

    select xpath('/bookstore/book/author[starts-with(.,"K")]/../title/text()', data) as titles 
    from bookstore b;
    

    我可能会以不同的方式解决这个问题,以便将每个匹配的标题视为单独的行,而不是使用 xmltable() 在数组中为每本书返回一行。然后使用xpath_exists()匹配名称

    select b.id, d.title, xpath('/book/author/text()', d.book) as authors
    from bookstore b
      cross join xmltable('/bookstore/book' passing data
                          columns
                             title text path 'title', 
                             book xml path '.') as d
    where xpath_exists('/book/author[starts-with(., "J")]', d.book)
    

    xmltable() 需要 Postgres 10 或更高版本

    Online example

    【讨论】:

      最近更新 更多