2010-07-20 99 views
7

請幫我創建一個包含10「其中」條款和順序應該是這樣的一個選擇查詢: 結果應該顯示在匹配降至至少大部分關鍵字(有條件的地方)的順序匹配。排序按最大條件匹配

注:所有10個條件是用 「OR」。

請幫我創建這個查詢。 我使用MS-SQL Server 2005的

像:

Select * 
    from employee 
where empid in (1,2,4,332,434) 
    or empname like 'raj%' 
    or city = 'jodhpur' 
    or salary >5000 

在上面查詢所有那些符合條件的最高紀錄應該是頂部和較少的匹配條件的記錄應該是在底部。

+0

您能否給您正在使用的查詢的例子嗎? – 2010-07-20 10:38:45

+0

一些示例模式會很有幫助。 – 2010-07-20 10:38:56

回答

12
SELECT * 
    FROM (SELECT (CASE WHEN cond1 THEN 1 ELSE 0 END + 
       CASE WHEN cond2 THEN 1 ELSE 0 END + 
       CASE WHEN cond2 THEN 1 ELSE 0 END + 
       ... 
       CASE WHEN cond10 THEN 1 ELSE 0 END 
       ) AS numMatches, 
       other_columns... 
      FROM mytable 
     ) xxx 
WHERE numMatches > 0 
ORDER BY numMatches DESC 
+0

這也很好。 – Tobiasopdenbrouw 2010-07-20 10:49:04

+0

看起來不錯,我不知道如何用doctrine + symfony做到這一點:D – 2014-06-02 08:44:22

+0

這需要在SQL教科書中。 – 2017-03-08 18:35:39

2

編輯:這個答案被張貼面臨的問題與一個具體的例子修改。 Marcelo's solution解決了實際問題。另一方面,我的回答是優先考慮特定領域的匹配。


你可能想嘗試像以下,ORDER BY子句中使用相同的表情在你的WHERE條款:

SELECT * 
FROM  your_table 
WHERE  field_1 = 100 OR 
      field_2 = 200 OR 
      field_3 = 300 
ORDER BY field_1 = 100 DESC, 
      field_2 = 200 DESC, 
      field_3 = 300 DESC; 

我最近回答了堆棧溢出類似的問題,其你可能有興趣在檢查出:

+0

這不會根據匹配數量進行排序。 – 2010-07-20 10:46:16

+0

是的,這是真的。原來的問題並不清楚......我試圖看看我能否調整我的答案。 – 2010-07-20 10:47:52

0

有很多選項/答案可能。最佳答案取決於數據,非功能性需求大小等

這就是說,我會做的是這樣的(易於讀取/調試):

Select * from 
    (Select *, iif(condition1 = bla, 1, 0) as match1, ..... , match1+match2...+match10 as totalmatchscore from sourcetable 
    where 
     condition1 = bla or 
     condition2 = bla2 
     ....) as helperquery 
    order by helperquery.totalmatchscore desc 
+1

使用Marcelo的解決方案。 – Tobiasopdenbrouw 2010-07-20 10:54:52

0

我不能讓這在Oracle上爲我工作。 如果使用oracle,那麼這個Order by Maximum condition match是一個很好的解決方案。 利用的情況下,當語言功能