需要一个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'
数据类型
答案 0 :(得分:5)
order by
支持nulls first/last
。默认情况下,asc
获取nulls last
,desc
获得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 - 通过相反设置值,例如......
相当一般,但不是很优雅。