Jon*_*Jon 76 xml sql sql-server sql-server-2005
如果您有varchar字段,则可以轻松SELECT * FROM TABLE WHERE ColumnA LIKE '%Test%'查看该列是否包含某个字符串.
你如何为XML Type做到这一点?
我有以下内容,只返回具有"文本"节点但我需要在该节点内搜索的行
select * from WebPageContent where data.exist('/PageContent/Text') = 1
Run Code Online (Sandbox Code Playgroud)
Squ*_*azz 68
另一种选择是将XML转换为nvarchar,然后搜索给定的字符串,就像XML vas a nvarchar字段一样.
SELECT *
FROM Table
WHERE CAST(Column as nvarchar(max)) LIKE '%TEST%'
Run Code Online (Sandbox Code Playgroud)
我喜欢这个解决方案,因为它很干净,易于记忆,很难搞乱,并且可以用作where子句的一部分.
编辑:正如克利夫提到的那样,你可以使用:
... nvarchar如果有没有转换为varchar的字符
mar*_*c_s 67
你应该可以很容易地做到这一点:
SELECT *
FROM WebPageContent
WHERE data.value('(/PageContent/Text)[1]', 'varchar(100)') LIKE 'XYZ%'
Run Code Online (Sandbox Code Playgroud)
该.value方法为您提供实际值,您可以定义要作为VARCHAR()返回的值,然后可以使用LIKE语句进行检查.
请注意,这不会非常快.因此,如果您的XML中有某些字段需要进行大量检查,则可以:
有了这个,你基本上将XML的某一部分"提取"到一个计算字段中,使其保持不变,然后你可以非常有效地搜索它(哎呀:你甚至可以INDEX那个字段!).
渣
Car*_*ger 10
另一种选择是通过将XML转换为字符串然后使用LIKE来将XML搜索为字符串.但是,由于计算列不能是WHERE子句的一部分,因此需要将其包装在另一个SELECT中,如下所示:
SELECT * FROM
(SELECT *, CONVERT(varchar(MAX), [COLUMNA]) as [XMLDataString] FROM TABLE) x
WHERE [XMLDataString] like '%Test%'
Run Code Online (Sandbox Code Playgroud)