7

我有一个名为“优先级”的(int)列。当我选择我的项目时,我希望最高优先级(最低编号)排在第一位,最低优先级(最高编号)排在最后。

但是,没有优先级的项目(当前优先级为 0)应该在具有优先级的项目之后的其他列中列出。

换句话说。如果我有这些优先事项:

 1 2 0 0 5 0 8 9

我如何对它们进行排序:

 1 2 5 8 9 0 0 0 

我想我可以使用 Int.max 代替 0,但是 0 构成了一个很好的默认值,我会尽量保留它。

4

5 回答 5

22

我认为它不会比这更干净:

ORDER BY priority=0, priority

SQLFiddle 演示

请注意,与任何其他解决方案不同,此解决方案将利用 index onpriority并且如果记录数量很大,则速度会很快。

于 2013-02-23T06:28:29.970 回答
7

尝试:

order by case priority when 0 then 2 else 1 end, priority
于 2013-02-22T11:38:04.480 回答
2

一个非常简单的解决方案可能是使用复合值/“前缀”进行排序,如下所示:

SELECT ...
FROM ...
ORDER By CASE WHEN priority = 0 THEN 9999 ELSE 0 END + priority, secondSortCriteriaCol
于 2013-02-22T11:38:18.707 回答
1

这会成功的。您需要将 testtable 替换为您的表名。

SELECT t.priority
FROM dbo.testtable t
ORDER BY (CASE WHEN t.priority = 0 THEN 2147483647 ELSE t.priority END)

如果不清楚我选择了 2147483647,因为这是优先级列的最大值,所以它将是最后一个。

马克的答案更好,并且可以使用。

于 2013-02-22T11:38:51.893 回答
0

order by case(priority) when 0 then 10 else priority end

于 2013-02-22T12:03:45.100 回答