T-SQL 按列中包含的搜索次数最多的词排序

T-SQL sort by most searched words containing in a column

例如我执行了以下查询:

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

它将 return question 包含以上 3 个单词中的任何一个的行。是否有可能结果的排序方式是在上述查询中包含最多单词的问题应该排在第一位等等(如下所示table)。 (搜索的词可能超过三个)

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

这就是 Full Test Search 的设计目的。此外,它可以匹配不同的语法形式,即 balancesbalance。您仍然可以尝试使用以下代码段中的常规语法:

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

如果你不想为每个搜索词写两次类似的条件,你可以使用带有条件聚合的 cte:

创建并填充示例 table(在您以后的问题中省去这一步)

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?')

查询:

;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

结果:

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