ORDER BY CASE & Ordinal 不工作

Posted

技术标签:

【中文标题】ORDER BY CASE & Ordinal 不工作【英文标题】:ORDER BY CASE & Ordinal not working 【发布时间】:2016-12-15 12:05:05 【问题描述】:

以第 7 列排序为例 -

这段代码根本不对数据进行排序:

 ORDER BY CASE WHEN '1'='2' THEN 5 
 WHEN '1'='1' THEN 7 
 ELSE 13 END

如果我将其更改为硬编码的序数,它会起作用:

ORDER BY 7

【问题讨论】:

'1' = '2' 等用于演示问题。它们实际上是真正的真/假表达式。 【参考方案1】:

只要SELECT列表中的各个表达式属于同一类型,就可以使用表达式本身来代替SELECT列表编号:

SELECT expression1, expression2, ...
...
ORDER BY CASE
            WHEN 1=2
            THEN expression5
            WHEN 1=1
            THEN expression7
            ELSE expression13
         END;

如果数据类型不同,则使用类型转换进行季节调整。

您的查询不起作用,因为只有整数文字可以用作ORDER BY 中的列号。在所有其他情况下,整数仅代表其常量值。

如果不是这样,ORDER BY 表达式很容易变得模棱两可。请看以下内容:

... ORDER BY intcol + 3;

应该是“添加三个”还是“从SELECT 列表中添加第三个表达式”?

【讨论】:

那么大小写和序数组合实际上是不可能的吗?我确实可以使用完整的列表达式使其工作。 @JanineRawnsley:正确。 quote from the manual "每个表达式可以是输出列(SELECT 列表项)的名称或序号,它可以是由输入列值形成的任意表达式 " 不可能,是的。我在答案中添加了解释。

以上是关于ORDER BY CASE & Ordinal 不工作的主要内容,如果未能解决你的问题,请参考以下文章

sql [mysql:ORDER BY中的CASE]在mysql的ORDER BY中使用CASE。 #mysql #sql

在 ORDER BY 中使用 CASE 语句

MySQL ORDER BY CASE 优化

ORDER BY 子句的 CASE WHEN 语句

Oracle order by case when 多条件排序

sqlserver复杂排序(order by case when)