2009-07-29 27 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