2012-01-30 66 views
1

我有一個使用NHibernate的標準查詢機制動態編譯的搜索查詢。產生的SQL查詢可能類似於:如何根據where子句匹配來實現排名(沒有全文索引)

select 
    * 
from 
    sometable 
where 
(
    (
     firstname like 'chris%' or 
     lastname like 'chris%' 
    ) 
    and 
    (
     firstname like 'vann%' or 
     lastname like 'vann%' 
    )  
) 

在表中的數據可能看起來像:

FirstName   LastName 
------------------------------ 
Chris    Smith 
John    Vann 
Chris    Vann 

我想訂結果,使得一排匹配的兩個子條款where子句(即firstname = Chris和lastname = Vann)的排名高於僅與其中一個子子句匹配的行。這是可能的標準SQL?

編輯:我大大簡化了問題,以回到問題的膽量。

回答

1

這只是一個開始。您可以創建一個計算priority列並按此列對行進行排序。該列是良好匹配行的指標。這裏所著給你一個示例代碼:

create table #t (f varchar(10), l varchar(10)); 

insert into #t values ('aa','ee'),('aa','ii'),('oo','ee'); 

select 
    *, 
    case when f like 'aa%' then 1 else 0 end + 
    case when l like 'aa%' then 1 else 0 end + 
    case when f like 'ii%' then 1 else 0 end + 
    case when l like 'aa%' then 1 else 0 end 
    as priority 
from #t 
order by 
    priority desc 

結果:

f l priority 
-- -- -------- 
aa ee 4   
aa ii 4   
oo ee 0 

對於您的架構可能是這樣的:

select 
    *. 
    case when firstname like 'chris%' and lastname like 'vann%' then 4 else 0 + 
    case when firstname like 'chris%' and lastname not like 'vann%' then 3 else 0 + 
    case when firstname not like 'chris%' and lastname like 'vann%' then 3 else 0 + 
    ... 
    as priority 
from 
    sometable 
where 
(
    (
     firstname like 'chris%' or 
     lastname like 'chris%' 
    ) 
    and 
    (
     firstname like 'vann%' or 
     lastname like 'vann%' 
    )  
) 
order by priority desc 
+0

我想過,但這種方法涉及一大堆adhoc(非參數化)SQL語句,我通常會盡量避免。 – Chris 2012-01-31 08:06:18

+0

@Chris,是的,我知道,我已經發布了這種方法,因爲你需要一個標準的SQL方法來執行此操作:「這是否可以用標準SQL?」。正如我所說:「這只是一個開始點」或許這可以幫助你最終的解決方案。問候。 – danihp 2012-01-31 08:11:13

相關問題