2011-12-07 19 views
0

當前正試圖編寫一個帶有containstable的select語句,搜索條件給了我一些悲傷。如何用and和or編寫containstable searchcondition

其目的是搜索具有3種不同參數類型的表並相應地對輸出進行排序。 (下面是我的代碼示例)

  1. 密鑰搜索條件(必須具備的,並在1加權)|| testvalue = Accountant
  2. 附加必須具備的(加權0.8)|| testvalue = Manager
  3. 最好有(加權0.5 )|| testvalue = Excel

SQL:

SELECT KTBL.Rank as [Ranking], KeySkills 
    FROM Applicants INNER JOIN 
     CONTAINSTABLE(Applicants, KeySkills, 
     '(ISABOUT("Accountant" weight(1))) & 
     (ISABOUT("Manager" weight(.8))) | 
     (ISABOUT("Excel") weight(.5))) 
    AS KTBL 
    ON Applicants.Id = KTBL.[KEY]; 

上面statem恩不會返回任何東西,我懷疑它是否有可能以上述方式疊加條款。

返回的結果必須具有會計,經理,會是不錯的Excel中

任何建議,以有我能做到這一點?

+0

MSFT網站表示嵌套允許http://msdn.microsoft.com/en-us/library/ms189760.aspx。你的權利是關於錯誤只有一個和逗號分隔後的值。看看示例A的語法。 – xQbert

+0

逗號分隔他們在一個isabout不會考慮我和/或邏輯的必要。我的示例代碼是以鏈接文章作爲背景編寫的。對我來說,文章會建議我的代碼應該可以工作,但不會。感謝您的回覆。 – Drauka

回答

0

我終於想出了一個解決我自己的問題,我現在很滿意。

我結束瞭如下面看到這裏(有點長篇大論),這需要3個參數 1.主搜索關鍵字(必須匹配)存儲過程 2.附加必須有逗號分隔字符串(必須匹配) 3附加最好有逗號分隔的字符串

CREATE PROCEDURE [dbo].[GetJobSeekers] 
(
@KeywordSearch nvarchar(500), 
@MustHave nvarchar(500), --Comma separated skills 
@NiceToHave nvarchar(500) --Comma separated skills 
) 
AS 
BEGIN 

SET NOCOUNT ON; 

DECLARE @SQL nvarchar(4000) 
DECLARE @SELECT nvarchar(4000) 
DECLARE @SEARCH nvarchar(4000) 
DECLARE @SEARCH1 nvarchar(4000) 
DECLARE @SEARCH2 nvarchar(4000) 
DECLARE @WHERE nvarchar(4000) 
DECLARE @ORDERBY nvarchar(4000) 

/*Used for string split*/ 
DECLARE @POS int 
DECLARE @NEXTPOS int 

/*Get Result for primary search key*/ 
SET @SELECT = 'SELECT ktbl.rank AS [Ranking], jobseekers.*' 
SET @SEARCH = 'ISABOUT("'[email protected]+'" weight(1))' 

SET @WHERE = ' FROM jobseekers INNER JOIN 
       CONTAINSTABLE (jobseekers, *, ''' + @SEARCH + ''') 
       AS ktbl On jobseekers.Id = ktbl.[KEY]' 

SET @ORDERBY= 'ORDER BY [Ranking] DESC' 

/* Get Result set for all additional must have keywords and INNER JOIN With primary Search */ 
IF @MustHave <> '' 

BEGIN 
    DECLARE @MustHaveSplitString nvarchar(500) 

    SET @POS = 1 
    WHILE(@POS <= LEN(@MustHave)) 
    BEGIN 
     SELECT @NEXTPOS = CHARINDEX(N',', @MustHave, @POS) 
     IF (@NEXTPOS = 0 OR @NEXTPOS IS NULL) 
       SELECT @NEXTPOS = LEN(@MustHave) + 1 
     SELECT @MustHaveSplitString = RTRIM(LTRIM(SUBSTRING(@MustHave, @POS, @NEXTPOS - @POS))) 

     SET @SELECT = @SELECT + ', ktbl'[email protected]+'.rank AS [Ranking'[email protected]+']' 
     SET @ORDERBY = @ORDERBY + ', [Ranking'[email protected]+'] DESC' 
     SET @SEARCH1 = 'ISABOUT("'[email protected]+'" weight(.8))' 
     SET @WHERE = @WHERE + ' INNER JOIN CONTAINSTABLE (jobseekers, *, ''' + @SEARCH1 + ''') 
           AS ktbl'[email protected]+' on Jobseekers.Id = ktbl'[email protected]+'.[KEY]' 
     SELECT @POS = @NEXTPOS+1  
    END 
END 


/*Get result set for all nice to have by stacking them in the isabout searchcondition and LEFT OUTER JOIN with Primary Search + Must have search if its there*/ 
IF @NiceToHave <> '' 
BEGIN 
    DECLARE @NiceToHaveSplitString nvarchar(500)   
    SET @SEARCH2 = 'ISABOUT(' 

    SET @POS = 1 
    WHILE(@POS <= LEN(@NiceToHave)) 
    BEGIN 
     SELECT @NEXTPOS = CHARINDEX(N',', @NiceToHave, @POS) 
     IF (@NEXTPOS = 0 OR @NEXTPOS IS NULL) 
       SELECT @NEXTPOS = LEN(@NiceToHave) + 1 
     SELECT @NiceToHaveSplitString = RTRIM(LTRIM(SUBSTRING(@NiceToHave, @POS, @NEXTPOS - @POS))) 

     SET @SEARCH2 = @SEARCH2 + '"'[email protected]+'" weight(.5),'    

     SELECT @POS = @NEXTPOS+1  
    END   
    /*Clean last , off the search2 string */ 
    SET @SEARCH2 = LEFT(@SEARCH2, LEN(@SEARCH2) -1) 
    /*Close the isabout in search2 string*/ 
    SET @SEARCH2 = @SEARCH2 + ')' 


    SET @SELECT = @SELECT + ', ktbl2.rank AS [Ranking2]' 
    SET @ORDERBY = @ORDERBY + ', [Ranking2] DESC' 

    SET @WHERE = @WHERE + ' LEFT JOIN CONTAINSTABLE (jobseekers, *, ''' + @SEARCH2 + ''') 
          AS ktbl2 on Jobseekers.Id =   ktbl2.[KEY]' 
END 

SET @SQL = @SELECT + @WHERE + @ORDERBY 

EXEC sp_executesql @SQL 
END 

存儲過程仍然不是100%完成,因爲它需要採取額外的邏輯考慮但它會暫時充當最終結果的殼。另外,我還沒有對任何大量的數據進行測試,所以我仍然不確定它的性能如何。

親切的問候,