1

SQL Server 中有没有一种方法可以根据WHERE子句中的值对行进行排名?

例如:

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 by(或select变量)执行相同的操作。

我建议您在数据库中执行此操作,因为在 SQL 和 C# 之间复制逻辑似乎是维护的噩梦。

于 2013-09-02T15:42:49.980 回答
0

不知道你true在 SQL 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 回答