SQL для сортировки логического столбца как true, null, false - PullRequest
18 голосов
/ 13 мая 2010

В моей таблице три логических поля: f1, f2, f3. Если я сделаю

SELECT * FROM table ORDER BY f1, f2, f3

записи будут отсортированы по этим полям в порядке false, true, null. Я хочу упорядочить их с нулем между истиной и ложью: правильный порядок должен быть истинным, нулевым, ложным.

Я использую PostgreSQL.

Ответы [ 4 ]

27 голосов
/ 13 мая 2010

Не красиво, но должно работать:

   ... order by (case when f1 then 1 when f1 is null then 2 else 3 end) asc
23 голосов
/ 20 декабря 2013

Лучшим решением было бы использовать

f1 DESC NULLS LAST

если вы согласны с порядком истина, ложь, ноль (я полагаю, что важной частью вашего вопроса было, как и в моей ситуации сейчас, собрать вместе неверные ваулеты)

https://stackoverflow.com/a/7621232/1627888

3 голосов
/ 11 ноября 2014

Вы также можете сделать следующее:

order by coalesce(f1, FALSE), coalesce(f1, TRUE), ...

Если f1 равно TRUE, вы получите: TRUE, TRUE
Если f1 равно NULL, вы получите: FALSE, TRUE
Если f1 равно FALSE, вы получите: FALSE, FALSE

, что соответствует требуемому порядку сортировки.

0 голосов
/ 21 ноября 2018

Также возможно сделать следующее:

... ORDER BY (CASE WHEN f1 IS NOT NULL THEN f1::int * 2 ELSE 1 END) DESC
...