1

WHERESQL Server で、句の値に基づいて行をランク付けする方法はありますか?

例えば:

SELECT *
FROM Foo
WHERE 
  Bar1 = true AND
  Bar2 = true OR
  Bar3 = false

この場合の最良の結果は、Bar1 = true、Bar2 = true、Bar3 = false の行です。Bar1 = true、Bar2 = true、および Bar3 = true の行は、Bar3 が異なるため、スコアが低くなります。

さらに複雑にするために。WHERE 句は動的です。どの列がクエリに表示されるか正確にはわかりません。したがって、次のクエリは次のようになります。

SELECT *
FROM Foo
WHERE 
  Bar1 = false OR
  Bar3 = true OR
  Bar4 = True

これらのクエリにランキングを適用するにはどうすればよいですか?

これはクエリ内で行うことができますか、それとも C# で行う方がよいでしょうか?

4

4 に答える 4

1

where一致する句の数で結果を並べ替えることができます。

order by ((case when Bar1 = true AND Bar2 = true then 1 else end) +
          (case when Bar3 = false then 1 else 0 end)
         ) desc

これを のフィールドに追加することもできますselect。を動的に作成している場合は、 (または変数)whereに対して同じことを行う必要があります。order byselect

SQL と C# の間でロジックを複製することはメンテナンスの悪夢のように思えるため、データベースでこれを行うことをお勧めします。

于 2013-09-02T15:42:49.980 に答える
0

trueSQL Server で何を意味するのかわかりません。バーがビット列の場合、次のようにランク付けできます。

select *
from Foo
order by
    case
       when Bar1 = 1 and Bar2 = 1 and Bar3 = 0 then 0
       else 1
    end asc

文字列の場合:

select *
from Foo
order by
    case
       when Bar1 = 'true' and Bar2 = 'true' and Bar3 = 'false' then 0
       else 1
    end asc
于 2013-09-02T15:48:24.927 に答える
0
WITH CTE 
     AS (SELECT T.*, 
                RN = ROW_NUMBER() 
                       OVER ( 
                         ORDER BY BAR1 ASC, BAR2 ASC, BAR3 DESC) 
         FROM   DBO.TABLENAME T) 
SELECT * 
FROM   CTE 
ORDER  BY RN 
于 2013-09-02T15:43:38.793 に答える
0

各節が満たされている場合は 1 のスコアを、満たされていない場合は 0 のスコアを与えることができます。そして、スコアの合計で注文できます。

何かのようなもの:

SELECT *
FROM Foo
ORDER BY cast((Bar1 = true) as int)
       + cast((Bar2 = true OR Bar3 = false) as int)
DESC
于 2013-09-02T15:44:01.353 に答える