检查存储在XML数据类型列中的集合中是否存在值

时间:2012-04-23 06:58:22

标签: sql sql-server sql-server-2008 tsql azure-sql-database

我有一个名为“tags”的XML数据类型列。

在那里,我正在存储一个集合,如下所示:

<ArrayOfString>
    <string>personal</string>
    <string>travel</string>
    <string>gadgets</string>
    <string>parenting</string>
</ArrayOfString>

我想选择具有我要查找的值之一的所有行:例如,我想选择表中具有“travel”标记的所有行。

我知道这有用,如果我知道我要找的值的索引:

select * from posts
where tags.value('(/ArrayOfString/string)[1]', 'nvarchar(1000)') = 'travel'

但只有当标签“travel”是节点中的第二项时,此查询才有效。如何检查值是否存在,无论其位置如何?

2 个答案:

答案 0 :(得分:7)

select *
from tags
where tags.exist('/ArrayOfString/string[. = "travel"]') = 1

或者像这样,如果你想检查一个变量。

declare @Val varchar(10)
set @Val = 'travel'

select *
from tags
where tags.exist('/ArrayOfString/string[. = sql:variable("@Val")]') = 1

答案 1 :(得分:4)

您可以尝试这样的事情:

SELECT
    *
FROM
    dbo.Posts
WHERE
    tags.exist('/ArrayOfString/string/text()[. = "travel"]') = 1

这将列出XML中其中一个字符串中“travel”的所有行