Ao contrário de alguns outros bancos de dados (como Oracle), o PostgreSQL possui um
boolean totalmente funcional tipo. Você pode usá-lo diretamente em um ORDER BY cláusula sem aplicar um CASE declaração - esses são ótimos para situações mais complexas. Ordem de classificação para
boolean valores é:FALSE -> TRUE -> NULL
Se você
ORDER BY bool_expression DESC , você inverte a ordem para:NULL -> TRUE -> FALSE
Se você quiser
TRUE first e NULL por último, use o NULLS LAST cláusula de ORDER BY :ORDER BY (featured AND created_at > now() - interval '11 days') DESC NULLS LAST
, created_at DESC
Claro,
NULLS LAST só é relevante se featured ou created_at pode seja NULL . Se as colunas estiverem definidas NOT NULL , então não se preocupe. Além disso,
FALSE seria classificado antes de NULL . Se você não quiser distinguir entre esses dois, você está de volta a um CASE instrução, ou você pode lançar em NULLIF() ou COALESCE() . ORDER BY NULLIF(featured AND created_at > now() - interval '11 days'), FALSE)
DESC NULLS LAST
, created_at DESC
Desempenho
Observe, como eu usei:
created_at > now() - interval '11 days'
e não :
now() - created_at < interval '11 days'
No primeiro exemplo, a expressão à direita é uma constante calculada uma vez . Em seguida, um índice pode ser utilizado para pesquisar linhas correspondentes. Muito eficiente.
Este último geralmente não pode ser usado com um índice. Um valor deve ser calculado para cada linha, antes que possa ser verificado em relação à expressão constante à direita. Não faça isso se puder evitar. Sempre!