If then else 条件按 order by 子句

If then else conditions in order by clause

我有一个包含以下字段的 table:

如何查询所有记录并按 discount_amount 排序,但前提是 discount_expires_at 大于当前时间?

无论如何都必须包括所有行,但只有在折扣尚未过期的情况下,它们才应首先出现。如果已过期,则必须按id降序排列

您可以简单地使用 case 表达式:

select *
from t
order by
    case when discount_expires_at > current_timestamp then 1 else 2 end,
    case when discount_expires_at > current_timestamp then discount_amount end desc,
    case when discount_expires_at > current_timestamp then null else id end desc

表达式 discount_expires_at > current_timestamp 条件为真或 false/unknown; select 基于这两个可能结果的所需列。

按复合值降序排列,如果折扣仍然有效,则为 (1, discount_amount),否则为 (0, id)。第一个常量 - 1 或 0 - 使过期折扣出现在有效折扣之后。

select * from the_table
order by 
 case
   when discount_expires_at > current_timestamp then (1, discount_amount)
   else (0, id)
 end desc;