2015-06-24 27 views
7

聯合查詢有了這樣的查詢自定義排序次序(簡化爲清楚起見):如何對Postgres裏

SELECT 'East' AS name, * 
FROM events 
WHERE event_timestamp BETWEEN '2015-06-14 06:15:00' AND '2015-06-21 06:15:00' 

UNION 

SELECT 'West' AS name, * 
FROM events 
WHERE event_timestamp BETWEEN '2015-06-14 06:15:00' AND '2015-06-21 06:15:00' 

UNION 

SELECT 'Both' AS name, * 
FROM events 
WHERE event_timestamp BETWEEN '2015-06-14 06:15:00' AND '2015-06-21 06:15:00' 

我想自定義生成的行的順序。喜歡的東西:

ORDER BY name='East', name='West', name='Both' 

或者

ORDER BY 
    CASE 
     WHEN name='East' THEN 1 
     WHEN name='West' THEN 2 
     WHEN name='Both' THEN 3 
     ELSE 4 
    END; 

然而,與Postgres的抱怨:

ERROR: invalid UNION/INTERSECT/EXCEPT ORDER BY clause 
DETAIL: Only result column names can be used, not expressions or functions. 
HINT: Add the expression/function to every SELECT, or move the UNION into a FROM clause. 

我還有別的選擇嗎?

回答

13

把它包在派生表(這是什麼「提示:....或移動UNION成FROM子句」是在暗示)

select * 
from (
    ... your union goes here ... 
) t 
order by 
    CASE 
     WHEN name='East' THEN 1 
     WHEN name='West' THEN 2 
     WHEN name='Both' THEN 3 
     ELSE 4 
    END; 
10

我想補充一個額外的列顯示所需的順序,然後使用ORDER BY中的順序列位置,例如

SELECT 1, 'East' AS name, * 
... 
UNION ALL 
SELECT 2, 'West' AS name, * 
... 
ORDER BY 1 

請注意,你可能也想UNION ALL因爲你添加的列確保在美利堅合衆國的每一套必須是不同的反正。

+0

男人你是天才,+1 –

0

通過爲排序目的添加一個額外的列,但它使UNION子句完全作爲UNION ALL(它不會消除結果中的重複行)。