2011-05-20 99 views
3

需要postgresql查询,该查询在非空值的末尾返回空值,而不考虑升序/降序。需要postgresql查询,该查询在非空值后返回空值

对于前: - 我有一个列说有值1,5,3,0,空purchase_price,空

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

0 
1 
3 
5 
null 
null 

ORDER BY purchase_price DESC它应该返回

5 
3 
1 
0 
null 
null 

我需要概括的解决方案,我可以能够申请​​其中,'float''string''integer''date'数据类型

回答

5

order by支持nulls first/last。默认asc得到nulls lastdesc得到nulls first。您可以覆盖他们为每列:

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

额外注上这样的:根本原因是空他们得到放置在B树索引的末尾。在PostgreSQL 9.0中,order by col desc nulls last经过优化,可以将索引扫描分为两部分(反向扫描非空行,后跟空行)。在原始版本中添加它的情况并非如此(8.4如果内存服务);后者继续对整个表进行seq扫描,然后进行快速排序)。而旧版本根本不支持该功能。所以请谨慎使用它,而不是最新版本的PostgreSQL。

+0

Thanx丹尼斯: - 它的作品gr8 .......... thanx为解释你保存我的几个小时....... – Salil 2011-05-20 09:39:46

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 

很显然你必须改变它的排序倒序 - 通过设定值的其他方式例如...

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

+1

使用union而不是union all可以防止返回重复行,即使源表具有重复行也是如此。 – 2011-05-20 06:16:21

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(全部是最重要的这里)与空的情况下,这将严格遵循之后。