如何在SQL中实现动态ORDER BY条件排序?
SQL动态排序调整方案
错误原因
原写法不符合SQL语法规则:IF 表达式不能直接用于拆分 ORDER BY 子句,排序逻辑需要全部封装在 ORDER BY 子句内部。
解决方案
场景1:每行单独判断排序依据(最常用,匹配原代码预期逻辑)
即对每一行数据,取该行 delivery_date 和 answer_date 中更大的那个值作为排序依据倒序排列,兼容所有SQL数据库的写法如下:
SELECT * FROM sgm_whatsapp WHERE `phone_number` = '51996268989' ORDER BY CASE WHEN delivery_date > answer_date THEN delivery_date ELSE answer_date END DESC;
如果使用MySQL方言,可简化为IF函数写法:
SELECT * FROM sgm_whatsapp WHERE `phone_number` = '51996268989' ORDER BY IF(delivery_date > answer_date, delivery_date, answer_date) DESC;
场景2:全局统一选择排序字段
如果需要先统计全局最大的两个日期,整个查询结果集统一按其中一个字段排序,写法如下(以MySQL为例):
-- 先统计全局最大值 SET @max_delivery = (SELECT MAX(delivery_date) FROM sgm_whatsapp WHERE `phone_number` = '51996268989'); SET @max_answer = (SELECT MAX(answer_date) FROM sgm_whatsapp WHERE `phone_number` = '51996268989'); -- 按全局判断结果选择排序字段 SELECT * FROM sgm_whatsapp WHERE `phone_number` = '51996268989' ORDER BY IF(@max_delivery > @max_answer, delivery_date, answer_date) DESC;
内容的提问来源于stack exchange,提问作者bBraian
相关产品推荐
相关产品推荐

