【问题标题】:Ordering by multiple fields in SQLite在 SQLite 中按多个字段排序
【发布时间】:2009-09-09 03:16:19
【问题描述】:

我有一个简单的表格,例如:int id, date created_at, date updated_at。我想对行进行排序,以便任何具有updated_at 的行都将按此排序,而任何没有的行将按created_at 排序。问题是这样的:

SELECT * FROM table ORDER BY updated_at, created_at 

不起作用。我一直在查看自定义订单条款,例如:

ORDER BY CASE WHERE updated_at ISNULL <do something> END, created_at

但似乎无法正常工作。 帮忙?

编辑: 我应该指定我希望updated_at 字段在created_at 字段之前排序。所以,如果数据看起来像:

id  created_at  updated_at
--  ----------  ----------
1   2009-01-08  null
2   2009-09-08  null
3   2009-07-02  null
4   2009-09-05  2009-09-06
5   2009-04-01  null
6   2009-09-07  2009-09-08

我想要这样的结果:

id  created_at  updated_at
--  ----------  ----------
6   2009-09-07  2009-09-08
4   2009-09-05  2009-09-06
2   2009-09-08  null
3   2009-07-02  null
5   2009-04-01  null
1   2009-01-08  null

【问题讨论】:

  • 根据您的更新更新了我的答案。

标签: sql sqlite


【解决方案1】:

看起来您正在寻找:

ORDER BY COALESCE(updated_at, created_at)

the docscoalesce 返回

第一个非 NULL 参数的副本。 如果所有参数都是 NULL,那么 NULL 是 回来。必须至少有 2 个 论据。

编辑:考虑到 OP 的编辑,他可能想要:

ORDER BY COALESCE(updated_at, '1929-9-9') DESC, created_at DESC

或类似的 DESC 排序技巧;或者也许

ORDER BY MAX(COALESCE(updated_at, '1929-9-9'), created_at) DESC

不可能从一个非常奇特的例子中准确地说明 OP 想要什么,但是其中一些方法的变体应该可以解决他的实际问题,无论该问题实际上可能是具体、精确和完整的细节。

【讨论】:

    【解决方案2】:

    IFNULL,见here

    在这种情况下,你会使用类似的东西:

    IFNULL(updated_at, '1-jan-2100'), created_at

    所有没有 updated_at 字段的列都将被赋予默认排序顺序,然后按 created_at 排序。 1-jan-2100 的值确保它们出现在列表的最后。如果您首先需要它们,请将其更改为 1900。

    【讨论】:

    • 谢谢,这非常有帮助,但这并不是我想要的,因为我的问题措辞不佳。已编辑。
    【解决方案3】:

    我知道这并不能准确回答您的问题,但它是一种替代解决方案。

    如果您在创建时将updated_at 字段设置为与created_at 相同,则您将始终拥有updated_at 的值,并且始终可以按updated_at 字段进行排序。只需少量重复,您就可以简化代码、生活和 sql 查询的效率。

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 1970-01-01
      • 2020-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-03
      相关资源
      最近更新 更多