2012-01-30 5 views
1

NHibernateの条件クエリメカニズムを使用して動的にコンパイルされた検索クエリがあります。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 

Iは、結果はそのような行はサブ節の両方に一致することを注文したいのですが、クエリは次のように見えるかもしれない結果のSQL where句(すなわち、firstname = Chrisとlastname = Vann)は、サブ句の1つと一致する行よりも高いランク付けをしています。これは標準SQLで可能ですか?

編集:私は問題の勇気に下るために質問を大幅に簡素化しました。

答えて

1

これは開始するための一歩です。計算priority列を作成し、この列で行を並べ替えることができます。列は、よく一致する行のインジケータです。あなたのためwritedここではサンプルコード:

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

+0

@Chrisはい、わかっていますが、これを行うための標準的なSQLの方法を尋ねるので、私はこのアプローチを投稿しました: "これは標準SQLで可能ですか?"私が言うように:これはちょうど開始点です "これはおそらくあなたの最終的なソリューションに役立つ可能性があります。よろしく。 – danihp

関連する問題