Сортировка нулевых значений после всех остальных, кроме специальных
У меня есть таблица элементов 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;
SELECT name FROM tasks
WHERE f_id=1
ORDER BY
CASE COALESCE(sort,88888)
WHEN -1 THEN 99999
ELSE COALESCE(sort,88888)
END,
id;
Все еще ищем более изящный способ сделать это только один раз, не выбирая его.