2016-07-07 50 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 –