SQL Server全文搜索仅包含匹配的整个单词

时间:2017-07-30 13:57:03

标签: sql sql-server

我目前正在使用

select * 
from movies 
where contains(Name, @SearchText)

但它不适用于jaw

等搜索

我还在存储过程中将任何空格转换为AND以支持多个单词:

set @SearchText = REPLACE(@SearchText, ' ', ' and ')

也可能导致它

电影表格:

ID  Name
---------------------
1   Jaws
2   Jaws 2: The revenge
3   Jaws 3-D
4   Rocky 5000

我在存储过程中有这个逻辑,@SearchText是可选的,默认为null。这也会引发错误:

  

空或全文谓词。

2 个答案:

答案 0 :(得分:0)

评论后编辑回答

CREATE TABLE #movies(
ID int,[Name] varchar(100))

INSERT #movies (ID,[Name])
VALUES (1,'Jaws'),
        (2,'Jaws 2: The revenge'),
        (3,'Jaws 3-D'),
        (4,'Rocky 5000')

DECLARE @SearchText nvarchar(100) = 'jaws revenge ';

--Remove spaces at the beginning and end
SET @SearchText = RTRIM(LTRIM(@SearchText));
--Replace spaces to build search string
SET @SearchText = REPLACE(@SearchText,' ','%'' AND [Name] LIKE ''%')
--Finish building sql query
SET @SearchText = 'SELECT * FROM #movies WHERE [Name] LIKE''%' + @SearchText + '%'''
--Execute query
EXEC sp_executesql @SearchText

DROP TABLE #movies

答案 1 :(得分:0)

我在代码而不是在sql中使用正确的包含语法

解决了这个问题

我认为这个问题是由于没有在每个单词周围包装双引号并添加通配符。

private static string PrepareSearchText(string searchText)
{
    if (string.IsNullOrEmpty(searchText))
        return "\"*\"";

    searchText = searchText.Trim();

    string rv = string.Empty;
    foreach (var item in searchText.Split(' '))
        rv += $"\"{item}*\" and ";

    return rv.Remove(rv.Length - 5);
}