2016-12-15 61 views
2

排序列#7为例 -ORDER BY CASE和序号不工作

此代码不会将数据在所有排序:

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

Sort ignored...

如果我将其更改为硬-coded序数它的工作原理:

ORDER BY 7 

enter image description here

+0

'1'='2'等被用于证明问题的目的。它们实际上是真正的/错误的表达。 –

回答

2

只要在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列表”添加表情第三?

+0

那么一个案例和序数组合实际上是不可能的?我确实可以使用完整的列表达式来工作。 –

+0

@JanineRawnsley:对。 [引自手册](https://www.postgresql.org/docs/current/static/sql-select.html#SQL-ORDERBY)“*每个表达式可以是输出列的名称或序号(SELECT列表项),**或**它可以是由输入列值组成的任意表达式*“ –

+0

这是不可能的,是的。我已经给答案添加了一个解释。 –