Dav*_*och 5 sql t-sql sql-server sql-server-2008
基本上我有这样一个表:
CREATE TABLE Person(
PersonID int IDENTITY(1,1) NOT NULL,
FirstName nvarchar(512) NOT NULL,
LastName nvarchar(512) NULL
)
Run Code Online (Sandbox Code Playgroud)
我需要根据用户查询找到前n个结果,如下所示:
"Joh Smi"
Run Code Online (Sandbox Code Playgroud)
以下查询返回我需要的结果(我认为).只是不在相关的顺序.
SELECT
PersonID, FirstName, LastName
FROM
Person
WHERE
FirstName LIKE 'Joh%' OR
LastName LIKE 'Joh%' OR
FirstName LIKE 'Smi%' OR
LastName LIKE 'Smi%'
Run Code Online (Sandbox Code Playgroud)
如果以下名称在数据库中并且我们的用户查询是"Joh Smi",则名称应按以下顺序出现(或类似)
我希望它能像facebook的自动完成朋友搜索一样工作.
那么,如何在SQL Server 2008中返回前n个最相关的行?
作为 OMG 小马答案的附录......
为了从全文搜索中获得最佳结果,您可能需要创建一个连接名字和姓氏字段的索引视图。
这将使您能够更精确地衡量全名的各个部分。
示例代码如下:
CREATE VIEW [dbo].[vFullname] WITH SCHEMABINDING AS
SELECT personID, FirstName + ' ' + LastName AS name
FROM dbo.person
WITH ranks AS(
SELECT FT_TBL.personid
,FT_TBL.name
,KEY_TBL.RANK
FROM dbo.vfullname AS FT_TBL
INNER JOIN CONTAINSTABLE(vfullname, (name),
'ISABOUT ("Smith" WEIGHT (0.4), "Smi*" WEIGHT (0.2),
"John" WEIGHT (0.3), "Joh*" WEIGHT (0.1))') AS KEY_TBL
ON FT_TBL.personid = KEY_TBL.[KEY]
)
SELECT
r.personID,
p.firstname,
p.lastname,
r.rank
FROM ranks r INNER JOIN
person p ON r.personID = p.personID
ORDER BY rank DESC;
Run Code Online (Sandbox Code Playgroud)
CTE 仅允许您返回单独的名字和姓氏字段。如果您不需要这些作为输出,请忽略它。
归档时间: |
|
查看次数: |
4387 次 |
最近记录: |