2016-07-07 31 views
2

我有一个PG数据库表价格。结构如下:Postgres:排序非零ASC加零和NULLS LAST

id name total_sales created_at 
1  A   0.0   2016-01-01 
2  B   1.25  2016-01-01 
3  C   8.17  2016-01-01 
4  D   15.09  2016-01-01 
5  E   0.0   2016-01-01 
6  F   NULL  2016-01-01 
7  G   2.25  2016-01-01 
8  H   19.34  2016-01-01 
9  I   47.91  2016-01-01 
10  J   0.0   2016-01-01 
11  K   NULL  2016-01-01 
12  L   0.01  2016-01-01 
13  M   5.11  2016-01-01 
14  N   27.53  2016-01-01 
15  O   3.53  2016-01-01 

我需要的是非常简单的。我想订购的记录,从而使:

项目升序排列值> 0.0至上其次 项目0.0,然后NULLS LAST

总之,我需要的O/p在下面的序列:

1st: 12 => 0.01 
2nd: 2 => 1.25, 
3rd: 7 => 2.25, 
4th: 15 => 3.53, 
5th: 13 => 5.11, 
6th: 3 => 8.17, 
7th: 4 => 15.09, 
8th: 8 => 19.34, 
9th: 14 => 27.53, 
10th: 9 => 47.91, 
11th, 12th, 13th all 0.0 
14th, 15th all NULLS 

所以,我试过以下的SQL,但没有工作!

SELECT * FROM prices 
ORDER BY CASE WHEN total_sales = 0.0 THEN 0 ELSE total_sales END ASC NULLS LAST 

回答

1
order by total_sales = 0 nulls last, total_sales 

false订单前true

+0

哇!我认为这只能通过Switch案例来实现。但是你提供的解决方案是整洁,清晰并且达到标准的!最佳答案 –

+0

它的简洁但不直观,这可能是一个维护问题。如果使用逻辑路标。 –

1

您有三类值的位置:

  1. 正值

这可以在case表情来表达,你可以使用辅助排序按升序顺序排序正值:

SELECT * 
FROM  prices 
ORDER BY CASE WHEN total_sales > 0 THEN 1 
       WHEN total_sales = 0 THEN 2 
       WHEN total_sales IS NULL THEN 3 -- Just for readability 
     END ASC, 
     total_sales ASC 
+1

这工作得很好..谢谢@Mureinik –