2016-09-06 1 views
0

Zum Beispiel I enthält folgende Abfrage ausgeführt:T-SQL sortieren nach am meisten gesuchte Wörter in einer Spalte

Select 
    id, question 
From 
    tblQuestions 
Where 
    question like '%Leave%' 
    or question like '%Balances%' 
    or question like '%Policy%' 

Es werden die Zeilen zurück, wo question eine der oben genannten drei Wörter enthält. Ist es möglich, dass das Ergebnis so sortiert ist, dass die Frage, die die meisten Wörter in der obigen Abfrage enthält, zuerst kommen soll usw. (wie in der folgenden Tabelle gezeigt). (gesuchte Worte können mehr als drei sein)

| id | question         | 
|----|--------------------------------------------| 
| 8 | Define the *policy* of *leave* *balances*? |  
| 2 | Why my *leave* *balance* is 0    |  
| 1 | What is *leave*?       | 

Antwort

1

Wenn Sie die gleichen Bedingungen zweimal für jeden Suchbegriff nicht schreiben wollen, können Sie einen CTE mit bedingter aggrigation verwenden können:

erstellen und füllen Beispieltabelle (Bitte speichern uns diesen Schritt in Ihrer zukünftigen Fragen)

DECLARE @T as table 
(
    Id int, 
    Question varchar(200) 
) 

INSERT INTO @T VALUES 
(1,'What is leave?'), 
(2,'Why my leave balance is 0?'), 
(3, 'Where is my mind?'), 
(8,'Define the policy of leave balances?') 

Die Abfrage:

;WITH CTE AS 
(
    SELECT Id, 
      Question, 
      SUM(CASE WHEN Question Like '%Leave%' THEN 1 ELSE 0 END) + 
      SUM(CASE WHEN Question Like '%Balance%' THEN 1 ELSE 0 END) + 
      SUM(CASE WHEN Question Like '%Policy%' THEN 1 ELSE 0 END) As MatchCount 
    FROM @T 
    GROUP BY Id, Question 
) 

SELECT Id, 
     Question 
FROM CTE 
WHERE MatchCount > 0 
ORDER BY MatchCount DESC 

Ergebnisse:

Id Question 
8 Define the policy of leave balances? 
2 Why my leave balance is 0? 
1 What is leave? 
1

Dies ist, was Full Test Search ausgelegt ist. Außerdem kann es verschiedene Grammatikformen, d. H. balances und balance, abgleichen. Sie können nach wie vor versuchen, regelmäßige Syntax zu verwenden, wie in folgendem Ausschnitt:

SELECT id, question 
FROM tblQuestions 
WHERE 
    question LIKE '%Leave%' 
    OR question LIKE '%Balance%' 
    OR question LIKE '%Policy%' 
ORDER BY 
    CASE WHEN question LIKE '%Leave%' THEN 1 ELSE 0 END + 
    CASE WHEN question LIKE '%Balance%' THEN 1 ELSE 0 END + 
    CASE WHEN question LIKE '%Policy%' THEN 1 ELSE 0 END DESC 
Verwandte Themen