Postgres:由非零点ASC排序,然后是Zeros,然后是NULLS LAST

时间:2016-07-07 19:43:54

标签: sql postgresql select sql-order-by

我有一个PG数据库表价格。结构如下:

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

我需要的是非常简单的。我想订购这样的记录:

值为&gt的商品;在ASCENDING命令中的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

2 个答案:

答案 0 :(得分:1)

order by total_sales = 0 nulls last, total_sales
false

之前的

true个订单

答案 1 :(得分:1)

这里有三类值:

  1. 正值
  2. 空值
  3. 这可以用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