2012-12-12 52 views
1

如何查詢表格存儲(ID,標題,公司) 以獲得標題包含「條款」的所有記錄,首先顯示完全匹配的記錄,然後是部分匹配。 換句話說,如果即時尋找 「富」 我的魔杖顯示訂單聯合但保持不同

  • 美孚記錄和兒子
  • 好富
  • 富吧
  • 足球
  • Herfooles

繼承人我有什麼

Create PROCEDURE [dbo].[SearchUserInfo] 
@query nvarchar(500), 
@term nvarchar(500) 

(SELECT Title,Company, 
1 as match 
FROM Stores 
WHERE CONTAINS(Title, @query)) 

UNION 

(SELECT Title,Company, 
0 as match 
FROM Stores 
WHERE Title like '%' + @term +'%') 

order by match desc 

此查詢的問題是它返回重複的記錄。 如果我刪除0作爲匹配tehn我不知道如何排序,所以來自CONTAINS的結果將出現在來自LIKE的結果之前。

感謝

回答

2

您可以將二者結合起來的結果集,然後使用GROUP BY來刪除重複項ORDER BY MAX(match) DESC放置返回的組CONTAINS第一

;WITH CTE 
    AS (SELECT Title, 
       Company, 
       1 AS match 
     FROM Stores 
     WHERE CONTAINS(Title, @query) 
     UNION ALL 
     SELECT Title, 
       Company, 
       0 AS match 
     FROM Stores 
     WHERE Title LIKE '%' + @term + '%') 
SELECT Title, 
     Company, 
FROM CTE 
GROUP BY Title, 
      Company 
ORDER BY MAX(match) DESC 
+0

你有使用UNION ALL的原因嗎?對我來說它也可以和UNION一起工作。感謝你的回答。 – Levon

+0

@Levon - 在這種情況下它可能會給你相同的計劃,因爲它不會因爲後面的GROUP BY而改變語義,但總的來說,你知道上半部分中的任何內容都不會在下半部分重複,因爲「匹配」的不同值,所以在兩個結果的這三列上沒有運行「DISTINCT」的點。 –

0

如果你不想使用全文搜索,你可以做一個單一的查詢:

select title, company, 
     (case when MatchType like 'FULL%' then 1 else 0 end) as Match 
from (select title, company, 
      (case when title like concat(@query, ' %') then 'FULL START' 
        when title like concat('% ', @query) then 'FULL END' 
        when title like concat('% ', @query, ' %') then 'FULL MIDDLE' 
        when title like concat(@query, '%') then 'PARTIAL START' 
        when title like concat('%', @query) then 'PARTIAL END' 
        when title like concat('%', @query, '%') then 'PARTIAL MIDDLE' 
        else 'NONE' 
       end) as MatchType 
     from Stores 
    ) s 
where MatchType <> 'NONE' 
order by MatchType 

這可能不會給你很大的靈活性喲你想用分隔符的話來說。但是,它確實可以讓您更好地控制匹配和結果排序的性質。

+0

看起來像對結果的更精細的控制,但不是我所期待的。 – Levon