我有通过在MS SQL中使用全文搜索过滤特定文本来查找行的要求。第一个要求是通过在xml列中搜索文本来查找行,第二个要求是通过搜索json列中的文本(nvarchar数据类型)来查找行。以下条件应返回结果。
XML Column
Criteria 1. Where Contains(XMLData,"1")
Criteria 2. Where Contains(XMLData,"/1/")
Criteria 3. Where Contains(XMLData,"<field>1</field>")
JSONDATA Column :
Criteria 1. Where Contains(JSONData,"1")
Criteria 2. Where Contains(JSONData,"/1/")
Criteria 2. Where Contains(JSONData,"PortalId:1")
我目前的实现是使用下面的查询,在运行数千条记录时会出现性能问题。除了以下代码之外还有其他方法吗?
XML QUERY
SELECT *
WHERE cast(XMLData as nvarchar(max)) LIKE '%/' + CONVERT(VARCHAR,'1') +'/%'
JSON QUERY
SELECT *
WHERE JSONDataLIKE '%/' + CONVERT(VARCHAR,'1') +'/%'
以下是此问题的示例表。
答案 0 :(得分:0)
我认为全文搜索不会对您有所帮助。您似乎正在寻找任何片段,例如/1/
等技术术语。
尝试使用XML
DECLARE @SearchFor VARCHAR(100)='1';
SELECT *
FROM SettingsData
WHERE xmldata.exist(N'//*[contains(text()[1],sql:variable("@SearchFor"))]')=1;
如果任何节点的内部text()
包含搜索词组,则会检查。但是找到内部带有1
的任何值(例如,在某处有1
的任何无关数字。)您可以搜索text()="1"
并仅在字符串时执行contains
长度超过一定的最小值。
像
这样的东西WHERE xmldata.exist(N'//*[text()[1]=sql:variable("@SearchFor") or(string-length(text()[1])>=3 and contains(text()[1],concat("/",sql:variable("@SearchFor"),"/")))]')=1;
Json是 - 到现在为止 - 只不过是一个字符串,必须解析。借助v2016,Microsoft引入了JSON支持,但您使用的是v2012。查找JSON字符串LIKE
的问题可能是,即使作为元素名称的一部分,您也会发现1。其余的如上所述......
SELECT *
FROM SettingsData
WHERE jsondata LIKE '%' + @SearchFor + '%';