我有一个名为“优先级”的(int)列。当我选择我的项目时,我希望最高优先级(最低编号)排在第一位,最低优先级(最高编号)排在最后。
但是,没有优先级的项目(当前优先级为 0)应该在具有优先级的项目之后的其他列中列出。
换句话说。如果我有这些优先事项:
1 2 0 0 5 0 8 9
我如何对它们进行排序:
1 2 5 8 9 0 0 0
我想我可以使用 Int.max 代替 0,但是 0 构成了一个很好的默认值,我会尽量保留它。
我有一个名为“优先级”的(int)列。当我选择我的项目时,我希望最高优先级(最低编号)排在第一位,最低优先级(最高编号)排在最后。
但是,没有优先级的项目(当前优先级为 0)应该在具有优先级的项目之后的其他列中列出。
换句话说。如果我有这些优先事项:
1 2 0 0 5 0 8 9
我如何对它们进行排序:
1 2 5 8 9 0 0 0
我想我可以使用 Int.max 代替 0,但是 0 构成了一个很好的默认值,我会尽量保留它。
我认为它不会比这更干净:
ORDER BY priority=0, priority
请注意,与任何其他解决方案不同,此解决方案将利用 index onpriority
并且如果记录数量很大,则速度会很快。
尝试:
order by case priority when 0 then 2 else 1 end, priority
一个非常简单的解决方案可能是使用复合值/“前缀”进行排序,如下所示:
SELECT ...
FROM ...
ORDER By CASE WHEN priority = 0 THEN 9999 ELSE 0 END + priority, secondSortCriteriaCol
这会成功的。您需要将 testtable 替换为您的表名。
SELECT t.priority
FROM dbo.testtable t
ORDER BY (CASE WHEN t.priority = 0 THEN 2147483647 ELSE t.priority END)
如果不清楚我选择了 2147483647,因为这是优先级列的最大值,所以它将是最后一个。
马克的答案更好,并且可以使用。
order by case(priority) when 0 then 10 else priority end