Нужен запрос postgresql, который возвращает нулевые значения после ненулевого значения - PullRequest
3 голосов
/ 20 мая 2011

Требуется запрос postgresql, который возвращает нулевое значение в конце ненулевого значения независимо от восходящего / нисходящего заказа.

Например: - у меня есть столбец с названием buy_price со значениями 1, 5,3, 0, ноль, ноль

Затем для ORDER BY purchase_price ASC Должно возвращаться

0
1
3
5
null
null

, а для ORDER BY purchase_price DESC Должно возвращаться

5
3
1
0
null
null

Мне нужно обобщитьрешение, которое я могу применить для 'boolean', 'float', 'string', 'integer', 'date' Тип данных

Ответы [ 3 ]

5 голосов
/ 20 мая 2011

order by поддерживает nulls first/last. По умолчанию asc получает nulls last, а desc получает nulls first. Вы можете переопределить их для каждого столбца:

order by col1 desc nulls last, col2 desc nulls first, etc

Дополнительное примечание: основная причина в том, что значения NULL помещаются в конце индекса btree. В PostgreSQL 9.0 order by col desc nulls last оптимизирован для разделения сканирования индекса на две части (обратное сканирование ненулевых строк, за которыми следуют нулевые строки). Это было не так в оригинальной версии, где он был добавлен (8.4, если память служит); последний выполняет последовательное сканирование всей таблицы с последующей быстрой сортировкой). И более старые версии вообще не поддерживают эту функцию. Так что будьте осторожны с его использованием во всех версиях PostgreSQL, кроме последних.

2 голосов
/ 20 мая 2011
select * from (select * from foo where x is not null order by x desc) a union all select  * from foo where x is null;

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

1 голос
/ 20 мая 2011

Я всегда делал это с хитрым объединением, следующим образом:

select *, '1' as orderCol
from table
where nullableColumn is not null
union
select *, '2' as orderCol
from table
where nullableColumn is null
order by orderCol, nullableColumn 

Вы явно должны изменить его для упорядочения desc - например, установив значения наоборот...

Довольно общий, но не очень элегантный.

...