所有其他后整理空值,除特殊所有其他后整理空值,除特殊(Sorting null values aft

2019-05-12 12:31发布

我有一个可选的排序场项目的PostgreSQL表:

CREATE TABLE tasks (
  id     integer  PRIMARY KEY DEFAULT nextval('f_seq'),
  f_id   integer  REFERENCES fixins,
  name   text     NOT NULL,
  sort   integer
);

我想是没有任务sort值所有其他后整理,但有一个例外:如果sort = -1我希望它以后的排序。 因此,例如,考虑到这些值:

id | f_id |   name   | sort
---+------+----------+-------
 1 |    1 | zeta     |    -1
 2 |    1 | alpha    |     1
 3 |    1 | gamma    |     3
 4 |    1 | beta     |     2
 5 |    1 | delta    |     
 6 |    1 | epsilon  |     

我希望他们排序为: alphabetagammadeltaepsilonzeta

我知道,我可以使用ORDER BY COALESCE(sort,99999)后,非空订购空值,但我怎么能找到那种特别的-1值后,那些来?

Answer 1:

更简单:

SELECT *
FROM   tasks
ORDER  BY (sort IS NOT DISTINCT FROM -1), sort;

怎么样?

Postgres有一个正确的boolean类型(不像其他一些RDBMS)。 你可以通过它,就像任何其他数据类型订购。 它可以是NULL像任何其他数据类型。 默认的排序是:

FALSE (0)
TRUE (1)
NULL

(sort IS NOT DISTINCT FROM -1)的计算结果为FALSE以外的所有值-1 -其评估TRUE和排序最后。 只需添加sort为二级ORDER BY项。

等效替代:

SELECT *
FROM   tasks
ORDER  BY (sort IS DISTINCT FROM -1) DESC, sort;

SQL小提琴。



Answer 2:

SELECT name FROM tasks
  WHERE f_id=1
  ORDER BY
    CASE COALESCE(sort,88888)
      WHEN -1 THEN 99999
      ELSE         COALESCE(sort,88888)
    END,
    id;

还在寻找一个更优雅的方式来只做峰结合一次,但不选择它。



文章来源: Sorting null values after all others, except special