2016-07-07 84 views
0

查詢:我期待搜索結果排名的SQL查詢

SELECT TOP 1000 t.columns 
FROM dbo.teams as t 
RIGHT JOIN fnParseString('Nugget,Tulsa',',') ps ON t.team_name LIKE '%'+ps.string+'%' OR t.nickname LIKE '%'+ps.string+'%' 

這確實返回我想要的結果,但卻排序是沒有用的。

我可以在搜索中添加更多列。

如何根據匹配項的準確性和數量對行進行排名?我知道它只需要匹配要選擇的術語之一,是否有一種方法可以計算與列匹配的術語數。

我看到Need help with SQL for ranking search results但將搜索任意數量的子選擇工作令牌

+0

你可以像這樣添加了一些選擇...'情況下t.team_name LIKE '%' + ps.string + '%',那麼1否則爲0 +情況下t.nickname LIKE '%' + ps.string +'%'然後1 else 0以Rank結束 – xQbert

回答

0

如果你是開放的一些動態SQL

Declare @SearchFor varchar(max) ='Daily,Production,default' -- Any comma delim string 
Declare @SearchFrom varchar(150) ='OD'      -- table or even a join statemtn 
Declare @SearchExpr varchar(150) ='[OD-Title]'    -- Any field or even expression 
Declare @ReturnCols varchar(150) ='[OD-Nr],[OD-Title]'  -- Any field(s) even with alias 

Set @SearchFor = 'Sign(CharIndex('''+Replace(Replace(Replace(@SearchFor,' , ',','),', ',''),',',''','[email protected]+'))+Sign(CharIndex(''')+''','[email protected]+'))' 
Declare @SQL nvarchar(Max) = 'Select * from (Select Distinct'[email protected]+',Hits='[email protected]+' From '[email protected] + ') A Where Hits>0 Order by Hits Desc' 

Exec(@SQL) 

返回

OD-Nr OD-Title     Hits 
3  Daily Production Summary 2 
6  Default Settings   1 
0

非動態選項,作爲對比。在添加更多列以檢查時,您必須添加到訂單和連接。

SELECT TOP 1000 t.columns 
FROM dbo.teams as t 
RIGHT JOIN fnParseString('Nugget,Tulsa',',') ps 
    ON t.team_name LIKE '%'+ps.string+'%' 
     OR t.nickname LIKE '%'+ps.string+'%' 
order by 
    case when t.team_name LIKE '%'+ps.string+'%' then 1 else 0 + 
    case when t.nickname LIKE '%'+ps.string+'%' then 1 else 0 
    desc