如何在SQL Server上使用XQuery返回某些顺序兄弟节点?

时间:2015-02-27 18:20:38

标签: sql-server xml xquery

鉴于以下代码段,我需要一个返回' a'的文本的查询。节点和第一个以下的文本' b'节点

declare @X xml = '
<root>
    <a>cat</a>
    <b>Cats don''t like milk</b>
    <a>dog</a>
    <c>not this</c>
    <b>Dogs like everything</b>
    <b>and not this</b>
</root>'

e.g。 -

Animal | Preference
-------|---------------------
cat    | Cats don't like milk
dog    | Dogs like everything       

使用像这样的节点方法 -

SELECT
    c.x.value(N'text()[1]','varchar(max)') as animal
    --,??? as preference
FROM
    @X.nodes('root/a') c(x)

我不认为相邻节点可以从&#39; x&#39;对象,因为它是该点的表变量。显然,XML不是最理想的,因为b节点应该更准确地是节点的子节点,但这就是数据的形状。 SQL Server仅限于XQuery的一个子集,这使得这更加困难。

1 个答案:

答案 0 :(得分:1)

this answer给予应有的感谢,这不是我们需要的,但它确实指向了>>运营商的方向。

缺乏合适的轴使得这一点更加复杂:

SELECT
    c.a.value('text()[1]','varchar(max)') as animal,
    c.a.query('
        let $a := . 
        return (../b[. >> $a][1])/text()'
    ).value('text()[1]','varchar(max)') as preference
FROM 
    @x.nodes('root/a') c(a)

我们必须将a节点分配给变量,以便能够查询其后的第一个b节点。