2013-05-03 36 views
0

我有這樣添加列查詢結果顯示無按鍵的成功比較在CONTAINS clasue

SELECT * from table1 where 
CONTAINS(column,'key1 OR key2 OR key3') 

查詢現在我想添加含有鍵的數量與另一列(key1,key2,key3)找到該行(1,2或3)。我該怎麼做?我不想使用'containstable'或freetexttable,因爲一旦我得到匹配的鍵號,我就會自己創建排名功能。

回答

1

你可以很容易地匹配足夠按鍵的數量:

select *, 
    case when Contains(Column, 'key1') then 1 else 0 end + 
    case when Contains(Column, 'key2') then 1 else 0 end + 
    case when Contains(Column, 'key3') then 1 else 0 end as [NumberOfMatchingKeys] 
    from Table1 
    where Contains(column, 'key1 OR key2 OR key3') 

你不能得到什麼,至少很容易,對於任何給定鍵匹配的數量。發現key2匹配7次是個問題。

一種可能的優化是從where子句除去Contains

select * from (
    select *, 
    case when Contains(Column, 'key1') then 1 else 0 end + 
    case when Contains(Column, 'key2') then 1 else 0 end + 
    case when Contains(Column, 'key3') then 1 else 0 end as [NumberOfMatchingKeys] 
    from Table1) as Louise 
where NumberOfMatchingKeys > 0 
+0

'選擇*,情況下,當含有(關鍵字, 'KEY1'),則1否則爲0端爲[密鑰1],殼體包含當(keyword,'key2')then 1 else 0 end as [Key2],當Contains(keyword,'key3')then 1 else 0 end as [Key3],case when Contains(keyword,'background')then 1 else 0結束,因爲table1中的[MatchingKeys]給了我任何鍵的匹配數。您的優化解決方案也很好。我可能會用它,如果我不需要給每個成功匹配的鍵賦予加權等級。我已經編輯了您的解決方案以包含我的解決方案 – thunderbird 2013-05-04 20:30:54

+0

stackoverflow同儕審查sucks ..如果您希望您可以編輯您的帖子以包括我的解決方案以及。 – thunderbird 2013-05-04 20:33:25

+1

@thunderbird - 如果您更改正在添加到2(1,2,4,...)冪的'1',那麼總和將是一個位掩碼,指示哪些鍵(如果有的話)匹配。您可以對零進行簡單測試以查看是否有匹配,或者'BitMask&4> 0'來查看第三個鍵是否匹配。組合也是可能的,例如,如果前三個鍵中的任何一個匹配,則'BitMask&7> 0'爲真。 – HABO 2013-05-04 20:51:45