如果你有一个varchar字段,你可以轻松地SELECT * FROM TABLE WHERE ColumnA LIKE '%Test%'
查看该列是否包含某个字符串。
你如何为XML Type做到这一点?
我有以下内容,只返回具有“文本”节点但我需要在该节点内搜索的行
select * from WebPageContent where data.exist('/PageContent/Text') = 1
答案 0 :(得分:62)
你应该能够很容易地做到这一点:
SELECT *
FROM WebPageContent
WHERE data.value('(/PageContent/Text)[1]', 'varchar(100)') LIKE 'XYZ%'
.value
方法为您提供实际值,您可以将其定义为VARCHAR(),然后可以使用LIKE语句进行检查。
请注意,这不会非常快。因此,如果您的XML中有某些字段需要进行大量检查,您可以:
有了这个,你基本上将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
在搜索条件存在的搜索中返回子字符串