需要一个postgresql查询,在非null值之后返回null值

时间:2011-05-20 05:57:34

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

需要一个postgresql查询,该查询在非空值的末尾返回空值,而不管升序/降序。

例如: - 我有一栏说buy_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'数据类型

3 个答案:

答案 0 :(得分:5)

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之外,要小心使用它。

答案 1 :(得分: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;

一个廉价的黑客,但你可以用你想要的任何顺序选择非空的情况,然后用空案例做一个UNION ALL(这一切都很重要),之后将严格遵循。

答案 2 :(得分:1)

我总是以偷偷摸摸的联盟做到这一点,大致如下:

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 - 通过相反设置值,例如......

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