Sql Server的CONTAINS函数无法处理某些URL数据。

11 浏览
0 Comments

Sql Server的CONTAINS函数无法处理某些URL数据。

在我的Sql Server数据库中,我有一个包含一个nvarchar(4000)字段的表,称为DataStructure。

在这个表中,我有2条记录,其中DataStructure字段的数据如下:

记录1:

{"FileName":"ACO23004000","SourceUrl":"http://mysite/TEST.TIF"}

记录2:

{"FileName":"ACO23004000","SourceUrl":"http://mysite.fm/TEST.TIF"}

我尝试使用Contains命令(全文搜索)在Sql Server中搜索值ACO23004000,如下所示:

Select *

from MyTable

where CONTAINS(DataStructure, '"*ACO23004000*"')

查询只返回第一条记录,似乎文本中的“.fm”值阻止了对第二条记录的搜索。

我该如何解决这个问题?可能有些字符会阻止CONTAINS命令正常工作吗?

0
0 Comments

问题出现的原因是在一个json格式的文本字段上应用条件时,CONTAINS函数不能正常工作。解决方法是使用OPENJSON操作符来解析json数据,并在文件名上施加相应的条件。

以下是解决问题的代码示例:

SELECT MyTable.*
FROM MyTable
CROSS APPLY OPENJSON(DataStructure) WITH(FileName VARCHAR(20) '$.FileName')
WHERE FileName = 'ACO23004000'

输出结果如下:

DataStructure
{"FileName":"ACO23004000","SourceUrl":"http://mysite/TEST.TIF"}
{"FileName":"ACO23004000","SourceUrl":"http://mysite.fm/TEST.TIF"}

你可以在OPENJSON操作符的WITH子句中为“SourceUrl”字段定义适合的类型,根据该字段的性质进行定义。

原文中还提到了使用全文索引的CONTAINS函数可以在少于1秒的时间内执行查询,但在存在8500万行数据和不同的json结构的情况下,并不适用于当前的情况。因此,需要类似于LIKE命令的功能(但速度更快,类似于带有全文索引的CONTAINS函数)。

0