SQL SERVER的XPath查询conditionnal

时间:2019-01-31 10:18:38

标签: sql sql-server xpath

我有一张表,其中一个名为“ configuration”的字段是XML类型:

<configuration>
  <element value="john" />
  <element value="kevin" />
  <element value="lisa" />
  <element value="david" />
  <element value="mike" />  
</configuration>

我想做什么,是检索所有的表中的记录或至少计数具有一个字段包含含有“值”属性的至少一个“元素”的属性“配置”等于“Lisa的表中的记录

目前,我所拥有的查询可以检索指定“元素”位置的“值”属性,例如:

select Configuration.value('(/configuration/element/@value)[0]', 'nvarchar(max)') // returns me 'john'
select Configuration.value('(/configuration/element/@value)[1]', 'nvarchar(max)') // returns me 'kevin'

2 个答案:

答案 0 :(得分:1)

在没有数据集的情况下,这有点伪SQL,而且有点猜测。在这种情况下(我认为),您只想返回存在节点configuration/element具有value属性'lisa'的行(?)。 如果我的猜测是正确的,那么类似的事情将起作用(您将不得不在括号({}中替换对象名称):

SELECT {Columns}
FROM [{Your Table}] YT
WHERE EXISTS (SELECT 1
              FROM [{Your Table}] E
                   CROSS APPLY E.[{Your XML Column}].nodes('configuration/element') C(E)
              WHERE E.[{Your ID Column}] = YT.[{Your ID Column}]
                AND C.E.value('./@value','varchar(50)') = 'lisa');

示例:

WITH VTE AS(
    SELECT 1 AS ID,
           CONVERT(xml,'<configuration>
  <element value="john" />
  <element value="kevin" />
  <element value="lisa" />
  <element value="david" />
  <element value="mike" />  
</configuration>') AS XMlCol
    UNION ALL
    SELECT 2 AS ID,
           CONVERT(xml,'<configuration>
  <element value="craig" />
  <element value="donald" />
  <element value="jenny" />
  <element value="jayne" />  
</configuration>') AS XMlCol)

SELECT *
FROM VTE YT
WHERE EXISTS (SELECT 1
              FROM VTE E
                   CROSS APPLY E.XMlCol.nodes('configuration/element') C(E)
              WHERE E.ID = YT.ID
                AND C.E.value('./@value','varchar(50)') = 'lisa');

这只会返回ID为1的行。

答案 1 :(得分:0)

请尝试以下操作

declare @xml as xml
set @xml='<configuration>
  <element value="john" />
  <element value="kevin" />
  <element value="lisa" />
  <element value="david" />
  <element value="mike" />  
</configuration>'
    SELECT   T.c.value('./@value','nvarchar(250)'  )    As element         

    FROM @xml.nodes('//element') AS T(c) 

and the result is