sql >> Base de Datos >  >> RDS >> PostgreSQL

Prioridad basada en tiempo en Active Record Query

A diferencia de otras bases de datos (como Oracle), PostgreSQL tiene un boolean completamente funcional tipo. Puedes usarlo directamente en un ORDER BY cláusula sin aplicar un CASE declaración:son geniales para situaciones más complejas.

Orden de clasificación para boolean valores es:

FALSE -> TRUE -> NULL

Si ORDER BY bool_expression DESC , inviertes el orden a:

NULL -> TRUE -> FALSE

Si quieres TRUE primero y NULL último, use el NULLS LAST cláusula de ORDER BY :

ORDER BY (featured AND created_at > now() - interval '11 days') DESC NULLS LAST  
       , created_at DESC

Por supuesto, NULLS LAST solo es relevante si featured o created_at puede ser NULL . Si las columnas están definidas NOT NULL , entonces no te molestes.

Además, FALSE se ordenaría antes de NULL . Si no desea distinguir entre estos dos, debe regresar a un CASE declaración, o puede lanzar NULLIF() o COALESCE() .

ORDER BY NULLIF(featured AND created_at > now() - interval '11 days'), FALSE)
                                                                DESC NULLS LAST
       , created_at DESC

Rendimiento

Nota, cómo usé:

created_at > now() - interval '11 days'

y no :

now() - created_at < interval '11 days'

En el primer ejemplo, la expresión de la derecha es una constante que se calcula una vez . Luego, se puede utilizar un índice para buscar filas coincidentes. Muy eficiente.

Este último generalmente no se puede usar con un índice. Se debe calcular un valor para cada fila antes de que se pueda comparar con la expresión constante de la derecha. No hagas esto si puedes evitarlo. ¡Nunca!