【问题标题】:How to find rows by filtering a specific text using Full text search in MS SQL 2012如何通过在 MS SQL 2012 中使用全文搜索过滤特定文本来查找行
【发布时间】:2018-07-08 03:29:39
【问题描述】:

我需要通过在 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') +'/%'

这是此问题的示例表。

http://sqlfiddle.com/#!18/f65ef/1

【问题讨论】:

  • 从 v2016 开始,SQL-Server 中集成了 JSON 支持。你是哪个版本的?
  • 嗨Shnugo-我正在使用SQL 2012。

标签: sql sql-server xml tsql sql-server-2012


【解决方案1】:

我认为全文搜索对你没有帮助。您似乎正在寻找任何片段,甚至像 /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 + '%';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-09
    • 2011-02-17
    • 1970-01-01
    • 2016-02-26
    • 2018-07-07
    • 2018-05-11
    • 1970-01-01
    • 2012-10-17
    相关资源
    最近更新 更多