使用LIKE语句上的SQL Server XML数据类型

问题描述 投票:66回答:4

如果你有一个varchar字段,你可以很容易地做到SELECT * FROM TABLE WHERE ColumnA LIKE '%Test%',看看是否该列包含特定字符串。

你怎么做,对于XML类型?

我有只返回有一个“文本”节点行下面,但我需要的是节点内搜索

select * from WebPageContent where data.exist('/PageContent/Text') = 1
sql sql-server xml sql-server-2005
4个回答
67
投票

你应该能够做到这一点很容易:

SELECT * 
FROM WebPageContent 
WHERE data.value('(/PageContent/Text)[1]', 'varchar(100)') LIKE 'XYZ%'

.value方法让你的实际值,并且可以定义要返回为VARCHAR(),然后您可以用LIKE语句查询。

你要知道,这不会是非常快的。所以,如果你在你的XML某些领域,你需要检查很多,你可以:

  • 创建一个存储功能,获取XML,并返回你的VARCHAR寻找价值()
  • 定义你的桌子上调用该函数一个新的计算领域,并使其持久化的列

有了这个,你基本上是“提取”的XML的某些部分到计算领域,使之坚持,然后你可以很有效地搜索(赫克:你甚至可以索引字段!)。


66
投票

另一个选择是投XML作为nvarchar的,然后搜索给定的字符串,如果XML VAS一个nvarchar的领域。

SELECT * 
FROM Table
WHERE CAST(Column as nvarchar(max)) LIKE '%TEST%'

我喜欢这个解决方案,因为它是干净的,容易记忆,很难陷入困境,并且可以作为一个where子句的一部分。

编辑:由于悬崖提到它,你可以使用:

... nvarchar的,如果有不转换为varchar字符


10
投票

另一种选择是将其转换为一个字符串,然后使用LIKE搜索XML作为一个字符串。但是作为一个计算列不能是你需要用它在另一个选择这样的WHERE子句的一部分:

SELECT * FROM
    (SELECT *, CONVERT(varchar(MAX), [COLUMNA]) as [XMLDataString] FROM TABLE) x
WHERE [XMLDataString] like '%Test%'

0
投票

这是使用基于marc_s回答什么,我要去:

SELECT 
SUBSTRING(DATA.value('(/PAGECONTENT/TEXT)[1]', 'VARCHAR(100)'),PATINDEX('%NORTH%',DATA.value('(/PAGECONTENT/TEXT)[1]', 'VARCHAR(100)')) - 20,999)

FROM WEBPAGECONTENT 
WHERE COALESCE(PATINDEX('%NORTH%',DATA.value('(/PAGECONTENT/TEXT)[1]', 'VARCHAR(100)')),0) > 0

返回的搜索一个字符串,其中搜索条件存在


推荐问答