在SQL Server

时间:2015-12-01 19:13:06

标签: sql sql-server contains sql-like

当我运行此查询时:

Select * from Table1 Where Column1 Like 'aaa%' --3 Result
Select * from Table1 Where Column1 Like 'a%' --3 Result
Select * from Table1 Where Column1 Like 'A%' --3 Result

但是当我跑步时

Select * from Table1 Where Contains(Column1 ,'aaa') --3 Result
Select * from Table1 Where Contains(Column1 ,'a') --0 Result
Select * from Table1 Where Contains(Column1 ,'A') --0 Result

CONTAINS可以搜索:As Per MSDN

  1. 一个单词或短语。
  2. 单词或短语的前缀。
  3. 靠近另一个词的一个词。
  4. 这是否意味着Contains无法搜索字母?

    如果是,那怎么样?

    EDIT2:

    declare @param as varchar(20)='a'
    select * from table1 where Contains(column1,@param)
    

    这是工作,

    declare @param as varchar(20)='"a*"'
    select * from table1  where Contains(column1,@param)
    

    但是,这不是

    declare @param as varchar(20)='a'
    select * from table1  where Contains(column1,@param+'*')
    

    select * from table1  where Contains(column1,'"'+@param+'*"')
    

2 个答案:

答案 0 :(得分:5)

您需要使用星号来执行前缀搜索:

WHERE CONTAINS(Column1 , ' "a*" ');
WHERE CONTAINS(Column1 , ' "A*" ');

除此之外,CONTAINS还需要使用停用词过滤器。阅读here

  

禁用词可以是具有特定语言或含义的词   可以是没有语言意义的令牌。例如,在   英语," a," "和" "是" """是   从全文索引中删除,因为它们已知无用   搜索。

要将输入作为参数传递,只需附加星号:

declare @SearchThis varchar(10) = 'A'; 
set @SearchThis = quotename(@SearchThis + '*', '"');
select @SearchThis;

完成SearchThis设置后,您可以在以下位置使用:

WHERE CONTAINS(Column1, @SearchThis)

答案 1 :(得分:-1)

CONTAINSLIKE强大得多。来自MSDN ...

  

LIKE与全文搜索的比较

     

与全文搜索相比,LIKE Transact-SQL谓词有效   仅限于字符模式。此外,您不能使用LIKE谓词   查询格式化二进制数据此外,LIKE查询大   非结构化文本数据的数量远远低于等效数据   针对相同数据的全文查询。对数百万人的LIKE查询   文本数据行可能需要几分钟才能返回;而全文   对于相同的数据,查询只需几秒或更短时间,具体取决于   返回的行数及其大小。另一个   考虑到LIKE只执行一个简单的模式扫描   整张桌子。相比之下,全文查询是语言感知的,   在索引和查询时应用特定的转换,例如   过滤停用词并进行词库和屈折扩展。   这些转换有助于全文查询改善其召回和   他们的结果的最终排名。

对于您的具体问题,您需要其他答案指示的前缀搜索。但是前往我链接的MSDN页面。它会帮助你。