【问题标题】:SQL: Sort by priority, but put 0 lastSQL:按优先级排序,但将 0 放在最后
【发布时间】:2013-02-08 00:21:00
【问题描述】:

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

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

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

 1 2 0 0 5 0 8 9

我该如何对它们进行排序:

 1 2 5 8 9 0 0 0 

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

【问题讨论】:

    标签: sql sqlite sql-order-by android-sqlite


    【解决方案1】:

    我认为没有比这更干净的了:

    ORDER BY priority=0, priority
    

    SQLFiddle Demo

    请注意,与任何其他解决方案不同,此解决方案将利用 priority 上的索引,并且在记录数量很大时会很快。

    【讨论】:

    • 我真的很喜欢这种语法的简单性,但有人能解释一下它为什么有效吗?
    • @dennisdeems:这是可行的,因为priority=0 是布尔值,并且 FALSE
    • 你是救生员。
    【解决方案2】:

    试试:

    order by case priority when 0 then 2 else 1 end, priority
    

    【讨论】:

    • 非常感谢。漂亮,干净,不显眼
    【解决方案3】:

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

    SELECT ...
    FROM ...
    ORDER By CASE WHEN priority = 0 THEN 9999 ELSE 0 END + priority, secondSortCriteriaCol
    

    【讨论】:

    • 好吧,我的回答晚了几秒钟;-)。而马克的另一款则更加优雅..
    【解决方案4】:

    这样就可以了。您需要将 testtable 替换为您的表名。

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

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2013-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-23
        • 1970-01-01
        • 1970-01-01
        • 2018-11-03
        • 1970-01-01
        相关资源
        最近更新 更多