我创建了一个学生表,并有以下记录。
我想在同一张桌子上进行搜索。我尝试了以下查询。
SELECT * FROM Students WHERE Name LIKE '%AM%'
它返回前两行作为结果集,这是正确的。
我想使用关键字CONTAINS执行相同的查询,而不是LIKE。
我尝试了以下查询,但它没有返回任何结果集。
SELECT * FROM Students WHERE CONTAINS(Name,'"AM"')
SELECT * FROM Students WHERE CONTAINS(Name,'"AM*"')
SELECT * FROM Students WHERE CONTAINS(Name,'"*AM*"')
请帮我解决这个问题。
提前致谢。
答案 0 :(得分:0)
为表格列定义全文索引并执行查询。
答案 1 :(得分:0)
运行此代码(或具有必要索引的此类代码)
为学生创建独特的索引IX_ID(ID)
创建FULLTEXT CATALOG Students_Catalog
你不能在单词的中间使用全文搜索,使用CTE也不正确(因为全文索引),所以我们会尝试使用一些技巧... < / p>
添加分割名称并使每个字母像单词
的功能/ * 作者:Paul Simpson(由Alex Peshik修改用于测试目的!) 创建日期:2012年7月19日(修订日期:2014年5月6日) 说明:在字母之间放置空格+下划线。示例:“GEORGE”变为“_G _E _O _R _G _E”* /
创建功能udf_PutSpacesBetweenChars
(@String VARCHAR(100))
RETURNS VARCHAR(100)
AS
BEGIN
DECLARE @pos INT, @result VARCHAR(100);
SET @result = @String;
SET @pos = 2 -- location where we want first space
WHILE @pos < LEN(@result)+1
BEGIN
SET @result = STUFF(@result, @pos, 0, SPACE(1));
SET @result = STUFF(@result, @pos+1, 0, '_') -- add underscore (to imitate word)
SET @pos = @pos+3; -- (the original was +2)
END
RETURN '_'+@result; -- add leading underscore (the original is w/o it)
END
在其上添加新列和索引(我们不能使用持久计算列,因为它的非确定性列。)
ALTER TABLE学生添加NameSpaced varchar(100)
更新学生SET NameSpaced = dbo.udf_PutSpacesBetweenChars(Name)
为学生创建FULLTEXT索引(NameSpaced)KEY INDEX IX_ID ON Students_Catalog;
使用特殊技术搜索近字母/'单词'。单词之间的距离为1,TRUE仅表示该顺序(“a,m”而不是“m,a”)。
SELECT *来自学生WHERE CONTAINS(NameSpaced,'NEAR((_ a,_m),1,TRUE)')
很抱歉,解决方案非常庞大,我不知道如何简化它......