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
相关产品推荐
相关产品推荐

