If then else 条件按 order by 子句
If then else conditions in order by clause
我有一个包含以下字段的 table:
- id
- discount_amount
- discount_expires_at
如何查询所有记录并按 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;
我有一个包含以下字段的 table:
- id
- discount_amount
- discount_expires_at
如何查询所有记录并按 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;