【问题标题】:Need a postgresql query which return null values afterf the non-null value需要一个 postgresql 查询,它在非空值之后返回空值
【发布时间】:2011-05-20 05:57:34
【问题描述】:

需要一个 postgresql 查询,它在非空值的末尾返回空值,而与升序/降序无关。

例如:- 我有一列说 purchase_price 的值为 1、5、3、0、null、null

那么对于ORDER BY purchase_price ASC应该返回

0
1
3
5
null
null

对于ORDER BY purchase_price DESC 它应该返回

5
3
1
0
null
null

我需要通用解决方案,我可以申请'boolean''float''string''integer''date' 数据类型

【问题讨论】:

    标签: ruby-on-rails postgresql sql-order-by


    【解决方案1】:

    order by 支持nulls first/last。默认情况下,asc 获取 nulls lastdesc 获取 nulls first。您可以为每一列覆盖它们:

    order by col1 desc nulls last, col2 desc nulls first, etc
    

    对此的额外说明:根本原因是它们被放置在 btree 索引的末尾。在 PostgreSQL 9.0 中,order by col desc nulls last 被优化为将索引扫描一分为二(反向扫描非空行,然后是空行)。在添加它的原始版本中不是这种情况(如果没有记错的话是 8.4);后者继续对整个表进行 seq 扫描,然后进行快速排序)。旧版本根本不支持该功能。因此,除了最新版本的 PostgreSQL 之外,请谨慎使用它。

    【讨论】:

    • Thanx Denis:- 它工作 gr8..........thanx 的解释,你节省了我几个小时.......
    【解决方案2】:
    select * from (select * from foo where x is not null order by x desc) a union all select  * from foo where x is null;
    

    一个便宜的 hack,但是您可以按照您想要的任何顺序选择非 null 案例,然后对 null 案例执行 UNION ALL(在这里一切都很重要),这将在之后严格遵循。

    【讨论】:

      【解决方案3】:

      我总是通过一个偷偷摸摸的联合来做到这一点,大致如下:

      select *, '1' as orderCol
      from table
      where nullableColumn is not null
      union
      select *, '2' as orderCol
      from table
      where nullableColumn is null
      order by orderCol, nullableColumn 
      

      您显然必须更改它以订购 desc - 例如通过相反的方式设置值...

      相当一般,但不是很优雅。

      【讨论】:

      • 使用 union 代替 union all 可以防止返回重复行,即使源表有重复行。
      猜你喜欢
      • 2021-04-05
      • 2022-11-20
      • 2017-09-02
      • 1970-01-01
      • 1970-01-01
      • 2019-05-14
      • 2018-06-15
      • 2022-01-01
      • 1970-01-01
      相关资源
      最近更新 更多