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

如果你有一个varchar字段,你可以很容易地做SELECT * FROM TABLE WHERE ColumnA LIKE '%Test%'来查看该列是否包含某个string。

你怎么做的XMLtypes?

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

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

你应该可以很容易地做到这一点:

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

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

请注意,这不会太快。 所以如果你的XML中有某些领域需要检查,你可以:

  • 创build一个获取XML的存储函数,并返回您正在查找的值作为VARCHAR()
  • 在你的表上定义一个调用该函数的新计算字段,并将其设置为PERSISTED列

有了这个,你基本上可以将XML的某个部分“提取”到一个计算字段中,使其保持不变,然后可以非常有效地进行search(甚至可以指定该字段!)。

渣子

还有一种select是将XML转换为nvarchar,然后search给定的string,就好像XML具有nvarchar字段一样。

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

我喜欢这个解决scheme,因为它很干净,容易记忆,很难搞清楚,可以作为where子句的一部分。

编辑:作为悬崖提到它,你可以使用:

… nvarchar是否有不转换为varchar的字符

另一个select是通过将XML转换为string然后使用LIKE来将XMLsearch为string。 然而,作为计算列不能是WHERE子句的一部分,你需要把它包装在另一个SELECT中,如下所示:

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

这是我将基于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 

在search条件存在的地方返回一个子string