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