2009-07-29 25 views
1

我有一个工作的FREETEXTTABLE查询搜索@searchString。我现在需要使用另一个试图将@searchString解析为INT的简单查询,如果成功,则通过查找PK等于解析@searchString的行来过滤表。订购FREETEXTTABLE结果UNION与标准SELECT排名

以前,我可以很容易地将FREETEXTTABLE结果加入到它正在搜索的表格中,按排序排序,但是只选择原始表格中被搜索的列。

现在,我将文本搜索查询与以搜索字符串作为关键字的查询之间的唯一结果相结合,我不再能够从文本搜索查询中访问等级。

如何在全文搜索结果前按照全文搜索的等级维护排序,但将查询结果放在主键所在的行(如果有结果)?

回答

0

您是否尝试过在您的联盟中添加一个常数,使您的PK在列表顶部完全匹配?我不记得自由文本RANK列返回的是什么(我认为0到1000),但是像这样的事情可以工作,假设你只是让自己的常数高于排名的顶部。

DECLARE @id int 

IF ISNUMERIC(@myStringId) = 1 
    SET @id = CAST(@myStringId AS int) 
ELSE 
    SET @id = 0 

WITH MyFreetextCte as (SELECT [Rank], 
           [Key] 
         FROM  FREETEXTTABLE(...) 
         UNION 
         SELECT 1001, 
           (SELECT MyBaseTable.PK FROM MyBaseTable WHERE PK = @id)) 
SELECT * 
FROM  MyFreetextCte JOIN MyBaseTable ON MyFreetextCte.[Key] = MyBaseTable.PK 
ORDER BY MyFreetextCte.Rank DESC 
+0

我可以看到你的answer--的有效性甩开了FREETEXTTABLE呼叫的连接,距离使用它*在联盟之后。不幸的是,我似乎无法解析SQL。它给我的问题使用'Rank'和'Key'。 另外,如果@searchString不是一个有效的整数,CAST是否会抛出异常?我最初有一个TRY CATCH块,根据转换调用是否成功设置值。如果演员失败优雅,那么我可以跳过。 – Brandon 2009-07-29 19:39:29

0

一吨从斯科特的帮助,这是我终于作品:

CREATE PROCEDURE dbo.testProcedure 
(
    @searchPhrase nvarchar(500) 
) 

AS 

DECLARE @id int 
SET @id = 0; 
BEGIN TRY 
    SET @id = CAST(@id AS int) 
END TRY 
BEGIN CATCH 
END CATCH; 
-- at this point, @id will be the primary key if it is only digits 
-- otherwise it will default to zero (which is out of range of my identity PK) 

WITH ftsTable AS (
    SELECT RANK, [KEY] FROM FREETEXTTABLE(sourceTable, *, @searchPhrase) 
    UNION 
    SELECT 1001, (SELECT sourceTableID FROM sourceTable WHERE sourceTableID = @id) 
) 

SELECT sourceTable.* 
FROM ftsTable JOIN sourceTable ON ftsTable.[KEY] = sourceTable.sourceTableID 
ORDER BY ftsTable.RANK DESC