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!