我试图查找列值是参数的一部分的记录。
通常情况下,我会使用类似搜索,但这会慢一些。
数据:
1 | Jungle Road
2 | Long Road
3 | Small Road
SQL:
DECLARE @c nvarchar(512) = 'My Street: Jungle Road My Nr: 8'
SELECT Id, StreetName FROM Customers WHERE @c like '%' + StreetName + '%'
结果:
1 | Jungle Road
使用以下@c值' My Street:Jungle My Nr:8' (所以没有' Road')我没有得到任何记录(如预期的那样)。
但是因为喜欢慢,我试图使用全文搜索。
SELECT Id, StreetName FROM Customers WHERE FREETEXT(StreetName, @c)
结果@c ='我的街道:丛林之路我的身份:8':
1 | Jungle Road
现在有了@c'我的街:Jungle My Nr:8' (没有' Road')结果仍然是:
1 | Jungle Road
问题:
如何将全文搜索更改为完全匹配搜索而不是部分字搜索?所以当完整列值是参数的一部分时,我只得到一个结果?
我正在使用SQL Server 2012
答案 0 :(得分:0)
试试这个:
CREATE TABLE #TEST (
ID INT IDENTITY PRIMARY KEY NOT NULL ,
StreetName NVARCHAR(512) NOT NULL
)
GO
INSERT INTO #TEST VALUES
('Jungle Road'),('Long Road'),('Small Road'),('My Street: Jungle Road My Nr: 8');
DECLARE @c nvarchar(512) = 'My Street: Jungle Road My Nr: 8';
SELECT Id, StreetName FROM #TEST WHERE @c like '%[' + StreetName + '%';
Resault:
Id StreetName
----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
4 My Street: Jungle Road My Nr: 8
只是为了更多:
INSERT INTO #TEST VALUES
('My Street: Jungle Road My Nr: 8 bbbb');
DECLARE @c nvarchar(512) = 'My Street: Jungle Road My Nr: 8';
SELECT Id, StreetName FROM #TEST WHERE @c like '%[' + StreetName + '%';
故事:
Id StreetName
----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
4 My Street: Jungle Road My Nr: 8
5 My Street: Jungle Road My Nr: 8 bbbb
答案 1 :(得分:0)
通常情况下,如果您希望结果为Jungle Road
,但仅Jungle
或Road
没有结果,您可以使用AND
运算符进行FULLTEXT查询,如下所示:
DECLARE @c nvarchar(512) = '"Jungle" and "Road"'
SELECT Id, StreetName FROM Customers WHERE CONTAINS(StreetName, @c)
CONTAINS比FREETEXT更准确,上述查询只返回包含Jungle
和'道路'的记录。
但是,如果您能够从用户输入的搜索字符串中提取确切的搜索字词,它将仅适用于您,就像@SqlZim建议的那样。您必须通过将单个单词与and
连接起来构建实际的FULLTEXT搜索字词,就像上面的@c
变量一样。
如果您不希望/无法将用户输入拆分为搜索词,那么您最好的办法是按排名订购您的FULLTEXT查询结果,并让用户选择最匹配的客户端:
DECLARE @c nvarchar(512) = 'My Street: Jungle Road My Nr: 8'
WITH cte AS (
SELECT [KEY],[Rank] from FREETEXTTABLE(Customers, StreetName, @c, 10)
)
SELECT c.* from cte
INNER JOIN Customers c on cte.[Key]=c.Id
FREETEXTTABLE
10的最后一个参数告诉SQL Server为您的搜索字符串@c
选择TOP 10最佳匹配记录。
尝试用FREETEXTTABLE替换CONTAINSTABLE并查看差异。
HTH。