使用where条件查询XML节点

时间:2018-10-22 08:50:25

标签: sql-server xml

我有一个具有以下属性的表:

[学生]

ID类数据(xml) 1个辅助XML数据

下面是我存储在data属性上的示例xml结构。

<Root>
    <Data>
        <Name>John</Name>
        <Rank>1</Rank>
    </Data>
    <Data>
        <Name>Peter</Name>
        <Rank>2</Rank>
    </Data>
</Root>

我想编写一个SQL查询,该查询将为我提供表中的以下数据:

ID,班级和等级2学生姓名 我的查询是

Select ID,Class,Data.value('(/Root/Data/Name)[1]', 'NVARCHAR(3)')   AS [Rank 2 Student Name] 
      FROM [Students]

这很好,但是将节点号硬编码为1并不是一个好主意,因为如果我在xml中添加新的Data节点,则数据将更改。这是可能的。因此,有一种方法可以为Rank值为2的节点指定返回名称。

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用此:

DECLARE @tbl TABLE (xmlcol xml )
INSERT INTO @tbl
VALUES ('<Root>
    <Data>
        <Name>John</Name>
        <Rank>1</Rank>
    </Data>
    <Data>
        <Name>Peter</Name>
        <Rank>2</Rank>
    </Data>
</Root>')

SELECT *
FROM 
(
SELECT r.d.value ('(./Name/text())[1]', 'varchar(50)') [Name],
       r.d.value ('(./Rank/text())[1]', 'varchar(50)') [Rank]
 FROM @tbl
    CROSS APPLY xmlcol.nodes ('/Root/Data') R(d)
) P 
WHERE P.[Rank] = 2 

这将输出以下结果:

Name    Rank
Peter   2

答案 1 :(得分:0)

您可以在xml中应用过滤器,如下所示:

DECLARE @Students TABLE(ID int, Class varchar(10), Data xml)

INSERT @Students VALUES (1,'A', '<Root>
    <Data>
        <Name>John</Name>
        <Rank>1</Rank>
    </Data>
    <Data>
        <Name>Peter</Name>
        <Rank>2</Rank>
    </Data>
</Root>')

SELECT ID,Class,Data.value('(/Root/Data[Rank=2]/Name)[1]', 'NVARCHAR(5)') AS [Rank 2 Student Name] 
FROM @Students

结果

ID          Class      Rank 2 Student Name
----------- ---------- -------------------
1           A          Peter

修改。如果“等级”包含自由文本,请使用引号:

DECLARE @Students TABLE(ID int, Class varchar(10), Data xml)

INSERT @Students VALUES (1,'A', '<Root>
    <Data>
        <Name>John</Name>
        <Rank>1</Rank>
    </Data>
    <Data>
        <Name>Peter</Name>
        <Rank>0:Company name</Rank>
    </Data>
</Root>')

SELECT ID,Class,Data.value('(/Root/Data[Rank="0:Company name"]/Name)[1]', 'NVARCHAR(5)') AS [Rank 2 Student Name] 
FROM @Students