T-SQL按包含在列中的大多数搜索词进行排序

时间:2016-09-06 04:36:52

标签: sql-server tsql search sql-order-by

例如,我执行了以下查询:

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

它将返回question包含上述3个字中的任何一个的行。是否有可能以一种方式对结果进行排序,使得包含上述查询中大多数单词的问题首先出现,依此类推(如下表所示)。 (搜索的单词可能超过三个)

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

2 个答案:

答案 0 :(得分:1)

这是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

答案 1 :(得分:1)

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

创建并填充样本表(在将来的问题中保存此步骤)

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?
相关问题