【问题标题】:How to get node content based on sibling content from xml column in database?如何根据数据库中 xml 列的兄弟内容获取节点内容?
【发布时间】:2015-10-23 20:54:27
【问题描述】:
<book>
 <author>a1</author>
 <title>t1</title>
</book>
<book>
 <author>a1</author>
 <title>t2</title>
</book>
<book>
 <author>a2</author>
 <title>t3</title>
</book>
<book>
 <author>a3</author>
 <title>t4</title>
</book>

我想获取作者的所有书名,并且只获取书名。图书信息作为 xml 数据存储在 db 列中。每个都在不同的行中。我尝试了各种价值调用,但它根本不起作用。我得到的最接近的是:

select parameters.query('//book[author="a1"]/title/text()') from tablename

但这会返回 4 行

"t1"
"t2"
""
""

请帮忙

【问题讨论】:

    标签: sql-server-2005 xquery-sql


    【解决方案1】:

    试试这个

    DECLARE @t TABLE (
        Data XML
    )
    INSERT INTO @t (Data)
    SELECT '<book>
     <author>a1</author>
     <title>t1</title>
    </book>
    <book>
     <author>a1</author>
     <title>t2</title>
    </book>
    <book>
     <author>a2</author>
     <title>t3</title>
    </book>
    <book>
     <author>a3</author>
     <title>t4</title>
    </book>'
    
    SELECT
        x.value('author[1]', 'VARCHAR(20)') AS Author
        ,x.value('title[1]', 'VARCHAR(20)') AS Title
    FROM @t t
    CROSS APPLY Data.nodes('/book') a(x)
    WHERE x.value('author[1]', 'VARCHAR(20)') = 'a1'
    
    /*
    Author  Title
    ------  -------
    a1         t1
    a1         t2
    */
    

    【讨论】:

      【解决方案2】:

      看来我误解了 value() 函数。我一直将 [1] 放在单引号之外,但它一直失败。以下产生了我正在寻找的东西:

      DECLARE @t TABLE (
      Book XML
      )
      INSERT INTO @t (Book) values ( '<book><author>a1</author><title>t1</title></book>')
      INSERT INTO @t (Book) values ( '<book><author>a1</author><title>t2</title></book>')
      INSERT INTO @t (Book) values ( '<book><author>a2</author><title>t3</title></book>')
      INSERT INTO @t (Book) values ( '<book><author>a3</author><title>t4</title></book>')
      select Book.value('(/book/title)[1]', 'VARCHAR(20)') as title from @t t
      where Book.value('(/book/author)[1]', 'VARCHAR(20)') = 'a1'
      

      感谢 RNA 团队提供 @t 示例,我不知道您可以将表声明为变量。节省了我很多时间,因为它允许我在没有真实数据的情况下进行实验

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-26
        • 1970-01-01
        • 2018-04-29
        • 1970-01-01
        • 2020-06-22
        • 1970-01-01
        相关资源
        最近更新 更多