【问题标题】:how to filter xml elements for multiple values如何过滤多个值的xml元素
【发布时间】:2019-02-01 21:00:17
【问题描述】:

XML 使用 xml 数据类型存储在 SQL Server 中的表中。

CREATE TABLE MyTable(
 i int primary key,   
XmlField xml NULL
)
insert into  MyTable(i, xmlField)  
values(1, N'<root>  
<Area1>  
 <Parent> 
     <Name>ParentJay</Name>
 <Spouse>Janice</Spouse>
     <child>John
        <grandchild>Kate</grandchild>
        <grandchild>Moss</grandchild>
        <grandchild>Ruby</grandchild>
        <grandchild>Violet</grandchild>
</child>
</Parent>
<Parent> 
<Name>ParentMark</Name>
<Spouse>May</Spouse>
<child>Mary
        <grandchild>Violet</grandchild>
        <grandchild>Kate</grandchild>
        <grandchild>jubi</grandchild>
</child>
</Parent>
<Parent> 
<Name>ParentJoe</Name>
<Spouse>kim</Spouse>
<child>Kelly
        <grandchild>Moss</grandchild>
        <grandchild>Kate</grandchild>
</child>
</Parent>
<Parent> 
<Name>ParentMike</Name>
<Spouse>Mia</Spouse>
<child>Mary
        <grandchild>Jeff</grandchild>
        <grandchild>jubi</grandchild>
        <grandchild>Violet</grandchild>
</child>
</Parent>
</Area1>
</root>')

问题:获取孙子名称为 Kate 和 Moss 的所有子节点

我有查询要让子元素由一个孙子 Kate 过滤。

有没有办法在查询中使用和/或过滤多个孙子的名字(凯特和莫斯)。

declare @v varchar(20) 
set @v='Kate'
SELECT  
child = x.value('local-name(..)', 'varchar(50)'),
value = x.value('(..)', 'varchar(50)') 
FROM   MyTable
CROSS APPLY XmlField.nodes('/root/Area1/Parent/child/*[contains((.),sql:variable("@v"))] ' ) as T2(x) 

Result
child   value
child   John    KateMossRubyViolet
child   Mary    VioletKatejubi
child   Kelly    MossKate


Result looking for:
child   value
child   John    KateMossRubyViolet
child   Kelly    MossKate

【问题讨论】:

    标签: sql-server xml


    【解决方案1】:

    我认为,您已将过滤谓词置于深度...

    您可以使用这样的查询

    SELECT grCh.query('.')
    FROM mytable
    CROSS APPLY xmlField.nodes('/root/Area1/Parent[child[grandchild="Kate" and grandchild="Moss"]]') A(grCh);
    

    您可以将其解读为:深入根目录 -> 区域 1 -> 父代。在这个级别,我们需要一个谓词。这里我们说:是否有一个节点&lt;child&gt;,它(还有一个谓词)有一个叫Kate 的孙子和一个Moss(你也可以使用or)。

    如果您不想硬编码它们,可以使用sql:variable()sql:column() 引入这些值。

    希望这会有所帮助...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      • 2023-04-07
      • 2021-10-28
      • 1970-01-01
      • 2014-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多