2015-06-24 14 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

एक व्युत्पन्न तालिका में लपेटें (जो क्या "संकेत: .... या एक में यूनिअन ले जाने के खंड से" का सुझाव दे रहा है)

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

उद्देश्य के आदेश के लिए अतिरिक्त कॉलम जोड़कर, हालांकि यह यूनियन क्लॉज को यूनियन ऑल के रूप में बिल्कुल काम करने के लिए बनाता है (यह परिणाम से डुप्लिकेट पंक्तियों को खत्म नहीं करता है)।