2016-12-15 37 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

這是不可能的,是的。我已經給答案添加了一個解釋。 –