我有一张表,其中一个名为“ 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'
答案 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)