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
的设计目的。此外,它可以匹配不同的语法形式,即 balances
和 balance
。您仍然可以尝试使用以下代码段中的常规语法:
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?
例如我执行了以下查询:
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
的设计目的。此外,它可以匹配不同的语法形式,即 balances
和 balance
。您仍然可以尝试使用以下代码段中的常规语法:
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?