从SQL Server中的xml,获取下一个兄弟值

时间:2012-05-04 10:53:09

标签: sql sql-server xml

我有一张看起来像这样的表:

CREATE TABLE CustomerXmlData
(CustomerId int,
CustomerData xml)

CustomerId链接到主customer表,CustomerData是一个xml文档,看起来像这样

<Person>
  <Product>
    <Name>ABC</Name>
    <Value>500</Value>
  </Product>
  <Product>
    <Name>XYZ</Name>
    <Value>600</Value>
  </Product>
</Person>

有几十万个这样的行。在伪代码中,我想要做的是“查找Value Product ='XYZ'”的平均Name

我知道如何根据元素属性或基于文档中具有唯一性的父级来获取值,但在这种情况下这些都不是任何用途。我找不到任何可以让我找到我想要的Name,然后获得下一个兄弟的价值的东西。

我可以使用FOR XML并创建一个边缘表,但是我是否必须使用游标遍历它?我希望有一个更有效的解决方案。

2 个答案:

答案 0 :(得分:5)

  

我找不到任何能让我找到我想要的名字的东西   然后得到下一个兄弟的价值。

declare @Name varchar(10)
set @Name = 'XYZ'

select N.value('.', 'int') as Value    
from CustomerXmlData
  cross apply CustomerData.nodes
    ('/Person/Product[Name = sql:variable("@Name")]/Value') as T(N)

答案 1 :(得分:1)

尝试此操作(已编辑为按名称过滤):

DECLARE @Name VARCHAR(50)
SET @Name = 'XYZ'

SELECT Name, AVG(Value) 
FROM (
SELECT 
    c.value('Name[1]', 'VARCHAR(50)') AS Name
    , c.value('Value[1]', 'DECIMAL') AS Value
FROM CustomerXmlData
CROSS APPLY CustomerData.nodes('//Product[Name = sql:variable("@Name")]') AS t(c)
) T
GROUP BY Name