2013-11-20 35 views
1

假設我有一個(代碼生成的)查詢在多個不同的字段中查找關鍵字。例如,術語University,SouthAfrica中的任何一個可能位於名稱字段或地址字段或其他字段中。我想找到其中任何一個字段匹配任何這些關鍵字的所有記錄:按匹配的OR條件數對SQL Server記錄進行排序

SELECT * 
FROM 
    Institutions 
WHERE 
    Institutions.name LIKE '%University%' OR 
    Institutions.address LIKE '%University%' OR 
    Institutions.name LIKE '%South%' OR 
    Institutions.address LIKE '%South%' OR 
    Institutions.name LIKE '%Africa%' OR 
    Institutions.address LIKE '%Africa%' 

然而,這是要拉一切。我想根據符合最可能條件的記錄進行排序。

我認爲這會工作,但看起來很笨重:

SELECT * 
FROM 
    Institutions 
WHERE 
    Institutions.name LIKE '%University%' OR 
    Institutions.address LIKE '%University%' OR 
    Institutions.name LIKE '%South%' OR 
    Institutions.address LIKE '%South%' OR 
    Institutions.name LIKE '%Africa%' OR 
    Institutions.address LIKE '%Africa%' 
ORDER BY 
    (
     CASE WHEN Institutions.name LIKE '%University%' THEN 1 ELSE 0 END + 
     CASE WHEN Institutions.address LIKE '%University%' THEN 1 ELSE 0 END + 
     CASE WHEN Institutions.name LIKE '%South%' THEN 1 ELSE 0 END + 
     CASE WHEN Institutions.address LIKE '%South%' THEN 1 ELSE 0 END + 
     CASE WHEN Institutions.name LIKE '%Africa%' THEN 1 ELSE 0 END + 
     CASE WHEN Institutions.address LIKE '%Africa%' THEN 1 ELSE 0 END 
    ) DESC 

有什麼清潔劑?我很喜歡SQL Server特有的解決方案,但純粹的SQL解決方案會很棒。

回答

0

您的解決方案看起來不錯給我,但這裏的別的東西,應該工作(僞代碼):

​​
+0

是的,我想過要做UNIONs + COUNT,但我不認爲這是可讀性方面的改進。我也想知道執行時間;我在考慮對已經過濾的數據使用case語句必須比一堆UNION更快。 –

0

也許是這樣的:

SELECT * FROM (
    SELECT i.*, 
    (
     CASE WHEN i.name LIKE '%University%' THEN 1 ELSE 0 END + 
     CASE WHEN i.address LIKE '%University%' THEN 1 ELSE 0 END + 
     CASE WHEN i.name LIKE '%South%' THEN 1 ELSE 0 END + 
     CASE WHEN i.address LIKE '%South%' THEN 1 ELSE 0 END + 
     CASE WHEN i.name LIKE '%Africa%' THEN 1 ELSE 0 END + 
     CASE WHEN i.address LIKE '%Africa%' THEN 1 ELSE 0 END 
    ) AS rnk 
    FROM Institutions i 
) result 
WHERE result.rnk > 0 
ORDER BY result.rnk DESC 

編輯:我忘了上Apply

SELECT * 
FROM 
    Institutions i 
CROSS APPLY 
(
     SELECT 
    (CASE WHEN i.name LIKE '%University%' THEN 1 ELSE 0 END + 
     CASE WHEN i.address LIKE '%University%' THEN 1 ELSE 0 END + 
     CASE WHEN i.name LIKE '%South%' THEN 1 ELSE 0 END + 
     CASE WHEN i.address LIKE '%South%' THEN 1 ELSE 0 END + 
     CASE WHEN i.name LIKE '%Africa%' THEN 1 ELSE 0 END + 
     CASE WHEN i.address LIKE '%Africa%' THEN 1 ELSE 0 END) as rnk 
) c 
ORDER BY c.rnk DESC 

Small example

+0

這與我重構我的原始解決方案非常接近。 –

+0

@JordanReiter我認爲已經很晚了,但我想起了這個問題,並添加了另一個解決方案。 – slavoo

相關問題