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

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的字符

  • 同上,或nvarchar,如果有不转换为varchar的字符SELECT*FROM表WHERE CAST(列为nvarchar(max))LIKE'%TEST%' (3认同)
  • 这对我来说比接受的答案更好。 (2认同)

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并返回您正在寻找的值作为VARCHAR()
  • 在表上定义一个新的计算字段,调用此函数,并使其成为PERSISTED列

有了这个,你基本上将XML的某一部分"提取"到一个计算字段中,使其保持不变,然后你可以非常有效地搜索它(哎呀:你甚至可以INDEX那个字段!).

  • 搜索整个字段:WHERE xmlField.value('.','varchar(max)')LIKE'%FOO%' (9认同)

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)