PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Prioridade baseada em tempo na consulta de registro ativo


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!