【问题标题】:Sort NULL values to the end of a table将 NULL 值排序到表的末尾
【发布时间】:2011-11-29 02:09:13
【问题描述】:

PostgreSQL 有没有办法将字段中具有NULL 值的行排序到所选表的末尾?

喜欢:

SELECT * FROM table ORDER BY somevalue, PUT_NULL_TO_END

【问题讨论】:

    标签: sql postgresql null sql-order-by


    【解决方案1】:

    NULL 按默认 升序 顺序排在最后。你不需要做任何额外的事情。

    此问题适用于 降序 顺序,这是完美的逆序,因此将 NULL 值排在最前面。
    PostgreSQL 8.3 介绍NULLS LAST

    ORDER BY somevalue DESC NULLS LAST
    

    对于 PostgreSQL 8.2 和更早版本或其他没有此标准 SQL 功能的 RDBMS:

    ORDER BY (somevalue IS NULL), somevalue DESC
    

    FALSE 排在TRUE 之前,所以NULL 值排在最后,就像上面的示例一样。

    见:

    【讨论】:

    • 恕我直言,在大多数现实世界的应用程序中,无论顺序如何,您都希望空值持续。例如,在可选的时间戳、名字、姓氏……上对 DESC 进行排序,所以我觉得它真的很可疑,尽管在数学上 DESC 顺序与 ASC 相反似乎是有道理的。也许空值只是属于它们自己的一个类别,不应该受 ASC、DESC 的影响并且总是放在最后,那将是一个更好的默认值。
    • 如果索引是 DESC,它可能会影响索引,也许您也可以添加一个注释? postgresql.org/message-id/…
    • @ChristopheRoussy:与排序顺序匹配的索引在上面的链接答案中被触及。
    • 我个人认为默认应该是相反的:NULLs 按升序排列,最后按降序排列。这更直观,因为 NULL 是“最小”值。
    • 对于来自 MYSQL 的人来说,这是一个大声笑吗?为什么一开始是这样建造的。或者 Mysql 是否过度优化了结果
    【解决方案2】:

    这成功了吗?

    ORDER BY somevalue DESC NULLS LAST
    

    取自:http://www.postgresql.org/docs/9.0/static/sql-select.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-01
      • 1970-01-01
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多