与其他一些数据库(如 Oracle)不同,PostgreSQL 具有全功能boolean
类型。您可以在不应用语句的情况下直接在ORDER BY
子句中使用它CASE
- 这对于更复杂的情况非常有用。
值的排序顺序为boolean
:
FALSE -> TRUE -> NULL
如果您ORDER BY bool_expression
DESC
,则将顺序反转为:
NULL -> TRUE -> FALSE
如果您想要TRUE
第一个和NULL
最后一个,请使用以下NULLS LAST
子句ORDER BY
:
ORDER BY (featured AND created_at > now() - interval '11 days') DESC NULLS LAST
, created_at DESC
当然,NULLS LAST
只有当featured
或created_at
可以是相关的NULL
。如果列已定义NOT NULL
,则不要打扰。
此外,FALSE
将在NULL
. 如果你不想区分这两者,你要么回到一个CASE
语句,要么你可以抛出NULLIF()
or COALESCE()
。
ORDER BY NULLIF(featured AND created_at > now() - interval '11 days'), FALSE)
DESC NULLS LAST
, created_at DESC
表现
注意,我是如何使用的:
created_at > now() - interval '11 days'
而不是:
now() - created_at < interval '11 days'
在第一个例子中,右边的表达式是一个计算一次的常数。然后可以使用索引来查找匹配的行。非常有效率。
后者通常不能与索引一起使用。必须为每一行计算一个值,然后才能根据右侧的常量表达式检查它。如果可以避免,请不要这样做。曾经!