【问题标题】:T-SQL XQuery for returning a result row per matching XML value for each nested elementT-SQL XQuery 用于为每个嵌套元素返回每个匹配 XML 值的结果行
【发布时间】:2015-12-08 14:53:07
【问题描述】:

给定表 y 中的 XML 数据类型列 x,其值如下:

<a>
<b>
<c>1</c>
<c>2</c>
<c>3</c>
</b>
</a>

如何使用 T-SQL XQuery 获取结果集,以便每个 &lt;c&gt; 元素值返回一行? 假设表 y 也有 z 列,其中包含 x 列中 &lt;c&gt; 元素的数量——这样我们就有了一个额外的列要返回。

到目前为止,我们能想到的最好的方法是:

select 
z, 
cvalues = x.query('data(a/b/c)')
from y

然而,上面将在 y 中每行返回一行,并在 cvalues 列中为&lt;c&gt; 元素的值提供一个空格分隔的列表。

我们怎样才能得到这样的结果集:

z cvalues
3 1
3 2
3 3

而不是我们现在得到的:

z cvalues
3 1 2 3 

谢谢!

【问题讨论】:

    标签: sql sql-server xml tsql xquery


    【解决方案1】:

    您可以将CROSS APPLYnodes 结合使用:

    SELECT 
      z, 
      cvalues = s.c.value('.', 'int')
    FROM y
    CROSS APPLY x.nodes('//c') AS s(c);
    

    LiveDemo

    输出:

    ╔═══╦═════════╗
    ║ z ║ cvalues ║
    ╠═══╬═════════╣
    ║ 3 ║       1 ║
    ║ 3 ║       2 ║
    ║ 3 ║       3 ║
    ╚═══╩═════════╝
    

    请记住:

    //c 匹配所有c xml 元素,无论它在层次结构中的哪个位置

    /a/b/c 将匹配嵌套在ab 内的c xml 元素

    【讨论】:

    • 非常好!为匹配部分增加了奖金。很高兴了解更多 XQuery:似乎它确实非常有用。
    猜你喜欢
    • 1970-01-01
    • 2021-03-21
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    相关资源
    最近更新 更多