Сортировка нулевых значений после всех остальных, кроме специальных

У меня есть таблица элементов 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  |     

Я хочу, чтобы они сортировались как: alpha, beta, gamma, delta, epsilon, zeta,

Я знаю, что я могу использовать ORDER BY COALESCE(sort,99999) упорядочить нулевые значения после ненулевых, но как я могу получить этот специальный -1 ценность, чтобы прийти после тех?

2 ответа

Решение

Simpler:

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

Как?

У Postgres есть свой boolean тип (в отличие от некоторых других СУБД). Вы можете заказать по нему, как и по любому другому типу данных. И это может быть 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 Fiddle.

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

Все еще ищем более изящный способ сделать это только один раз, не выбирая его.

Другие вопросы по тегам