在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