如果您有varchar字段,则可以轻松SELECT * FROM TABLE WHERE ColumnA LIKE '%Test%'
查看该列是否包含某个字符串。
您如何针对XML类型执行此操作?
我有以下内容,仅返回具有“文本”节点的行,但我需要在该节点内搜索
select * from WebPageContent where data.exist('/PageContent/Text') = 1
Answers:
您应该能够很容易地做到这一点:
SELECT *
FROM WebPageContent
WHERE data.value('(/PageContent/Text)[1]', 'varchar(100)') LIKE 'XYZ%'
该.value
方法为您提供了实际值,您可以定义该值作为VARCHAR()返回,然后可以使用LIKE语句进行检查。
请注意,这不会太快。因此,如果您的XML中有某些字段需要大量检查,则可以:
这样,您基本上可以将XML的特定部分“提取”到一个计算字段中,使其持久化,然后就可以非常高效地对其进行搜索(哎呀,您甚至可以索引该字段!)。
马克
另一个选择是将XML强制转换为nvarchar,然后搜索给定的字符串,就像XML使用了nvarchar字段一样。
SELECT *
FROM Table
WHERE CAST(Column as nvarchar(max)) LIKE '%TEST%'
我喜欢这种解决方案,因为它干净,易于记忆,难以弄乱,并且可以用作where子句的一部分。
编辑:正如悬崖提到的那样,您可以使用:
... nvarchar(如果某些字符不能转换为varchar)
另一种选择是通过将XML转换为字符串然后使用LIKE来搜索XML作为字符串。但是,由于计算列不能成为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
在存在搜索条件的搜索中返回子字符串