在 ORDER BY 中使用 CASE 语句

Posted

技术标签:

【中文标题】在 ORDER BY 中使用 CASE 语句【英文标题】:Using CASE statements in ORDER BY 【发布时间】:2013-09-17 12:34:49 【问题描述】:

我有一个查询需要根据其他字段采用不同的顺序。可以在ORDER BY 中使用CASE 语句,到目前为止一切正常。唯一似乎不可能的事情是更改升序/降序部分。

我的查询:

SELECT articleid, MIN(createtime) min,  MAX(createtime) max
FROM items 
GROUP BY articleid
ORDER BY
       CASE WHEN logic='foo' THEN min ELSE '0001-01-01 00:00:00' END ASC,
       CASE WHEN logic='bar' THEN max ELSE '0001-01-01 00:00:00' END DESC;

有效,但我想知道是否可以制作这样的表格(我知道这不起作用):

SELECT articleid, MIN(createtime) min,  MAX(createtime) max
FROM items 
GROUP BY articleid
ORDER BY
       CASE WHEN logic='foo' THEN min ASC ELSE max DESC END;

【问题讨论】:

您不能将ASCDESC 放在机箱内。它仅适用于您要排序的整个表达式。 【参考方案1】:

ASCDESC 只允许出现在表达式的末尾。但是,您可以将 ASC 放在末尾,并在 ELSE 子句中否定最大值(假设没有使问题复杂化的空值)。

ORDER BY
    CASE WHEN logic='foo' THEN min ELSE -max END ASC;

【讨论】:

以上是关于在 ORDER BY 中使用 CASE 语句的主要内容,如果未能解决你的问题,请参考以下文章

使用 Case 语句的具有多列的 Order By 子句

mysql - ORDER BY 语句中的 IF...ELSE 或 CASE

ORDER BY 中带有 CASE WHEN 的 SQL 语句导致类型转换错误

提高Order by语句查询效率的两个思路

SQL语句中,如果有group by 和order by两个语句,是先分组还是先排序?

SQL语句中,如果有group by 和order by两个语句,是先分组还是先排序?