LIKE 选择文本中任意位置独立存在的单词

bal*_*alu 7 sql-server-2008 query pattern-matching

在此处输入图片说明

我有一个包含以下文本的表格,我要搜索的关键字是“搜索”。所以我写了一个查询

SELECT [ID]
  ,[TextValue]
FROM
   [dbo].[SearchLike]
WHERE
   [TextValue] LIKE '%Search%'
Run Code Online (Sandbox Code Playgroud)

Q.1如何修改查询,以便只返回文本中包含“搜索”的记录,而不是使用“LSearch”。即根据图像前三个记录只返回。?

gbn*_*gbn 8

使用喜欢

  • 单行如搜索:

    WHERE
     ' ' + [TextValue] + ' ' LIKE '%[.,;:() ]Search[.,;:() ]%'
    
    /* [] contains list of allowable characters, adding spaces around 
       [TextValue] removes need to have multiple OR [TextValue] LIKE */
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果没有填充,您将需要专门处理出现在字符串开头/结尾的字符串:

    WHERE
        [TextValue] LIKE '%Search%' --middle
        OR
        [TextValue] LIKE 'Search%'   --start
        OR
        [TextValue] LIKE '%Search'   --end
    
    Run Code Online (Sandbox Code Playgroud)

使用全文索引

Edit2,对于全文纯粹主义者

CREATE FULLTEXT INDEX AUTO 选项的 MSDN 状态(默认)

尽管更改会自动传播,但这些更改可能不会立即反映在全文索引中。

因此,它可能不会给出正确的结果。但几秒钟后它就会。

此外,对于多达几个 10k 行,它将充分执行:它缩放 O(n)。我在一个大约有 25k 行的表上使用 LIKE,但用户知道如果他们以这种方式搜索(它在“高级”页面上),它的性能会很差。我通过管理全文索引获得了权衡

全文搜索是不是正确的解决方案,它是一个选项

注意:经验告诉我,SQL Server 中的全文索引对性能有严重影响,即:仅在您确实需要并且知道自己在做什么时才实施!(@安德鲁·比克顿)

  • 这不是一个可扩展的解决方案。In 将使用索引扫描或表扫描。随着表格的增长,搜索表格的时间将急剧增加。显示的全文选项是应该使用的选项。 (2认同)

Eri*_*elp 6

如果您的表将有大量行,您可能想尝试使用 FULLTEXT 索引。它会快得多,并且只会匹配确切的单词。

CREATE FULLTEXT CATALOG <catalog_name> AS DEFAULT;

CREATE FULLTEXT INDEX ON [dbo].[SearchLike](TextValue)
    KEY INDEX pk_id; --requires the existing of a PK or UQ index with this name on this table
Run Code Online (Sandbox Code Playgroud)

现在搜索您的文本:

SELECT [ID]
  ,[TextValue]
FROM
   [dbo].[SearchLike]
WHERE
   CONTAINS([TextValue], 'Search')
Run Code Online (Sandbox Code Playgroud)

更多关于: