You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ORDER BY子句使用IF THEN ELSE条件实现折扣数据自定义排序问题

实现方案

核心逻辑

  • 第一排序优先级:区分记录是否过期,未过期的记录整体排在已过期记录前面
  • 第二排序优先级:未过期的记录按discount_amount排序(默认升序,若需优惠力度大的优先可自行调整为降序)
  • 第三排序优先级:已过期的记录按id降序排序

通用SQL实现代码

SELECT * 
FROM 你的表名
ORDER BY
  -- 第一排序规则:未过期返回0、过期返回1,值小的排前,实现未过期优先
  CASE WHEN discount_expires_at > NOW() THEN 0 ELSE 1 END ASC,
  -- 第二排序规则:仅未过期记录按折扣金额排序,过期记录该字段值为NULL不参与该层排序
  CASE WHEN discount_expires_at > NOW() THEN discount_amount END ASC,
  -- 第三排序规则:仅过期记录按id降序排序,未过期记录该字段值为NULL不参与该层排序
  CASE WHEN discount_expires_at <= NOW() THEN id END DESC;

不同数据库适配说明

  • MySQL环境:直接使用上述代码即可,NOW()为系统自带当前时间获取函数
  • PostgreSQL环境:将代码中NOW()替换为CURRENT_TIMESTAMP即可兼容
  • SQL Server环境:将代码中NOW()替换为GETDATE()即可兼容

提示:如果需要优惠金额更高的未过期记录排在更靠前的位置,只需把第二个排序规则的ASC修改为DESC即可。

内容的提问来源于stack exchange,提问作者Diyan Slavov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:36:01