2014-03-27 32 views
2

我想按連接的一部分進行排序。按連接的一部分選擇的字段排序 - PostgreSQL

例如:

SELECT DISTINCT(field1 ||' '||field2) AS field3 from Table ORDER BY field1; 

這可能在一些其他的方式呢?我收到一個錯誤,指出我無法按未選中的字段排序。

有沒有辦法選擇一個字段,但使其不可見,以便我可以ORDER BY它呢?

+2

'distinct'是** **不一個函數。 –

回答

2

這可以通過使用子查詢或CTE來完成或者:

子查詢:

SELECT c.field3 
FROM (SELECT DISTINCT(field1 ||' '||field2) AS field3 from Table) c 
ORDER BY c.field3; 

CTE:

WITH ConcatTable AS (
    SELECT DISTINCT(field1 ||' '||field2) AS field3 from Table 
) 
SELECT field3 FROM ConcatTable ORDER BY field3; 

它也可以通過簡單地重複所選擇的表達來完成,雖然我不喜歡因爲代碼重複:

SELECT DISTINCT(field1 ||' '||field2) 
FROM Table 
ORDER BY field1 ||' '||field2; 

======編輯=========

正如在註釋中指出的那樣,連接字段的排序與字段1的排序並不完全相同。如果你真的想只是FIELD1進行排序,你會做這樣的事情:

子查詢:

SELECT c.field3 
FROM (SELECT DISTINCT field1, (field1 ||' '||field2) AS field3 from Table) c 
ORDER BY c.field1; 

CTE:

WITH ConcatTable AS (
    SELECT DISTINCT field1, (field1 ||' '||field2) AS field3 from Table 
) 
SELECT field3 FROM ConcatTable ORDER BY field1; 
+0

不按'field1'排序 –

+0

Field1是連接表達式的第一個組件,因此它將按field1排序;這只是根據field2進行的二次排序,我希望這不會失去資格。 OP的問題:是否有某些原因讓你不能在ORDER BY中提及field2? –

+2

並非在所有情況下,沒有。作爲一個反例,考慮2行,#1是'('a','c')',#2是'('ab','c')',其中'lc_collat​​e = en_US.utf-8'。按字段1排序會給#1然後是#2,而用'field1 ||'排序'|| field2'給出#2然後#1。 –