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!