我公司的SQL Server 2008数据库中有两个表。第一个表格代表我公司销售的产品。第二个表包含产品制造商的详细信息。这些表定义如下:
Product
-------
ID
Name
ManufacturerID
Description
Manufacturer
------------
ID
Name
您可以想象,我希望让客户尽可能轻松地查询此数据。但是,我在写一个宽容但强大的搜索查询时遇到了问题。例如,我期待人们根据语音拼写进行搜索。因此,数据可能与我的数据库中的确切数据不匹配。此外,我认为有些人会首先按制造商的名称进行搜索,但我希望首先显示匹配的产品名称。根据这些要求,我目前正在进行以下查询:
select
p.Name as 'ProductName',
m.Name as 'Manufacturer',
r.Rank as 'Rank'
from
Product p inner join Manufacturer m on p.ManufacturerID=m.ID
inner join CONTAINSTABLE(Product, Name, @searchQuery) as r
奇怪的是,这个查询引发了一个错误。但是,我不知道为什么。 Squiggles出现在管理工作室最后一个括号的右侧。工具提示“在预期条件的上下文中指定的非布尔类型的表达式”。我理解这句话的意思。但是,我想我不知道COntainsTable是如何工作的。我做错了什么?
谢谢
答案 0 :(得分:2)
首先,我认为在加入全文CONTAINSTABLE时需要一个'ON'子句。请参阅Microsofts网站上的这个例子:
USE Northwind;
GO
SELECT FT_TBL.Description, FT_TBL.CategoryName, KEY_TBL.RANK
FROM Categories AS FT_TBL
INNER JOIN CONTAINSTABLE (Categories, Description,
'("sweet and savory" NEAR sauces) OR
("sweet and savory" NEAR candies)'
) AS KEY_TBL
ON FT_TBL.CategoryID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
AND FT_TBL.CategoryName <> 'Seafood'
ORDER BY KEY_TBL.RANK DESC;
GO
http://msdn.microsoft.com/en-us/library/ms177652.aspx
您需要通过添加如下的连接子句将Product表链接到正确的搜索结果:
SELECT
p.Name AS 'ProductName',
m.Name AS 'Manufacturer',
r.Rank AS 'Rank'
FROM
Product p
INNER JOIN Manufacturer m ON p.ManufacturerID=m.ID
INNER JOIN CONTAINSTABLE(Product, Name, @searchQuery) AS r
ON p.ID = r.[KEY]
否则,您不知道结果表中的哪些行连接到源表中的相应行。
其次,除非您使用通配符(例如CONTAINS
),否则CONTAINSTABLE
和'"bol*"'
都会返回完全匹配的字符串。即使使用通配符,您也只能使用后缀通配符,因此对于'"bol*"'
,它会找到所有以'bol'
开头的单词。 '"*bol*"'
将找不到包含'bol'
的字词。对于不精确的模糊样式搜索,您应该使用FREETEXT( ... )
或FREETEXTTABLE( ... )
。
返回包含基于字符的数据类型的列的零行,一行或多行的表,其中与指定的freetext_string中的文本的含义相匹配,但不符合的确切含义 。
http://msdn.microsoft.com/en-us/library/ms177652.aspx
权衡是CONTAINS
比FREETEXT
表现更好,而FREETEXT
提供更自然的结果。
最后,如果你想在语音上匹配SQL Server有内置函数SOUNDEX,它试图根据拼音或参数生成一个字母数字键。
-- Using SOUNDEX
SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe');
Copy
----- -----
S530 S530
(1 row(s) affected)
http://msdn.microsoft.com/en-us/library/ms187384.aspx
我建议不要使用soundex,我发现它在过去是有限的,因为Soundex真的只能确保语音从语音开始。 Soundex总是返回起始字母,前三个辅音用数字表示。有更好的算法版本被设计为soundex的替代品,请参阅Double Metaphone(或可用作标量函数的T-SQL version of Double Metaphone)。
Soundex或DoubleMetaphone未内置于SQL Server全文中,因此您需要手动实施搜索。
SELECT * FROM MyTable where SOUNDEX( MyColumn ) = SOUNDEX( 'MySearchQuery' )