2015-06-24 80 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(它不会消除结果中的重复行)。