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

时间:2009-12-02 13:40:50

标签: sql sql-server xml sql-server-2005

如果你有一个varchar字段,你可以轻松地SELECT * FROM TABLE WHERE ColumnA LIKE '%Test%'查看该列是否包含某个字符串。

你如何为XML Type做到这一点?

我有以下内容,只返回具有“文本”节点但我需要在该节点内搜索的行

select * from WebPageContent where data.exist('/PageContent/Text') = 1

4 个答案:

答案 0 :(得分:62)

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

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

.value方法为您提供实际值,您可以将其定义为VARCHAR(),然后可以使用LIKE语句进行检查。

请注意,这不会非常快。因此,如果您的XML中有某些字段需要进行大量检查,您可以:

  • 创建一个存储函数,该函数获取XML并返回您正在寻找的值作为VARCHAR()
  • 在您的表上定义一个新的计算字段,该字段调用此函数,并使其成为PERSISTED列

有了这个,你基本上将XML的某个部分“提取”到一个计算字段中,使其保持不变,然后你可以非常有效地搜索它(哎呀:你甚至可以INDEX那个字段!)。 / p>

马克

答案 1 :(得分:56)

另一种选择是将XML转换为nvarchar,然后搜索给定的字符串,就像XML输入nvarchar字段一样。

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

我喜欢这个解决方案,因为它很干净,易于记忆,很难搞乱,并且可以作为where子句的一部分使用。

编辑:正如克利夫提到的那样,你可以使用:

  

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

答案 2 :(得分:10)

另一种选择是通过将XML转换为字符串然后使用LIKE来将XML搜索为字符串。但是,由于计算列不能成为WHERE子句的一部分,因此需要将其包装在另一个SELECT中,如下所示:

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

答案 3 :(得分: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

在搜索条件存在的搜索中返回子字符串