2011-06-21 10 views
9

पोस्टग्रेएसक्यूएल (7.4 और 8.x) चल रहा है और मैंने सोचा कि यह काम कर रहा था लेकिन अब मुझे त्रुटियां मिल रही हैं।यूनियन के साथ केस के साथ एसक्यूएल ऑर्डर सभी

मैं अलग-अलग प्रश्नों को चला सकता हूं और यह ठीक काम करता है, लेकिन यदि मैं यूनियन या यूनियन सब कुछ एक त्रुटि फेंकता है।

यह त्रुटियों आउट: (चेतावनी: pg_query(): क्वेरी विफल रहा है: त्रुटि: स्तंभ "फ़ील्ड 1" मौजूद नहीं है ... आदेश मामला "फ़ील्ड 1" डब्ल्यू द्वारा ...)

SELECT "Field1" AS field_1, "Field2" AS field_2, 
"Field3" AS field_3, "Field4" AS field_4 
FROM "TableName" 
WHERE condition 
AND other_condition 
UNION ALL 
SELECT "Field1" AS field_1, "Field2" AS field_2, 
"Field3" AS field_3, "Field4" AS field_4 
FROM "TableName" 
WHERE yet_another_condition 
AND yet_another_other_condition 
ORDER BY CASE "Field1" 
    WHEN 'A' THEN 1 
    WHEN 'B' THEN 2 
    WHEN 'C' THEN 3 
    ELSE 4 
END 

यह काम करता है :

SELECT "Field1" AS field_1, "Field2" AS field_2, 
"Field3" AS field_3, "Field4" AS field_4 
FROM "TableName" 
WHERE yet_another_condition 
AND yet_another_other_condition 
ORDER BY CASE "Field1" 
    WHEN 'A' THEN 1 
    WHEN 'B' THEN 2 
    WHEN 'C' THEN 3 
    ELSE 4 
END 

और यह रूप में अच्छी तरह से काम करता है:

SELECT "Field1" AS field_1, "Field2" AS field_2, 
"Field3" AS field_3, "Field4" AS field_4 
FROM "TableName" 
WHERE condition 
AND other_condition 
ORDER BY CASE "Field1" 
    WHEN 'A' THEN 1 
    WHEN 'B' THEN 2 
    WHEN 'C' THEN 3 
    ELSE 4 
END 

और अगर मैं आदेश द्वारा बंद छोड़ने के लिए और बस सभी यह यूनिअन या संघ का उपयोग साथ ही काम करता है।

कोई विचार?

उत्तर

13

किसी अन्य रूप में रखो सब कुछ का चयन करें:

SELECT * FROM (
    SELECT "Field1" AS field_1, "Field2" AS field_2, 
    "Field3" AS field_3, "Field4" AS field_4 
    FROM "TableName" 
    WHERE condition 
    AND other_condition 
    UNION ALL 
    SELECT "Field1" AS field_1, "Field2" AS field_2, 
    "Field3" AS field_3, "Field4" AS field_4 
    FROM "TableName" 
    WHERE yet_another_condition 
    AND yet_another_other_condition 
) As A 
ORDER BY CASE field_1 
    WHEN 'A' THEN 1 
    WHEN 'B' THEN 2 
    WHEN 'C' THEN 3 
    ELSE 4 
END 

या, बेहतर आदेश देकर में अन्य नाम का उपयोग, के रूप में यह यूनिअन के अंत में पारित हो जाता है:

SELECT "Field1" AS field_1, "Field2" AS field_2, 
    "Field3" AS field_3, "Field4" AS field_4 
    FROM "TableName" 
    WHERE condition 
    AND other_condition 
    UNION ALL 
    SELECT "Field1" AS field_1, "Field2" AS field_2, 
    "Field3" AS field_3, "Field4" AS field_4 
    FROM "TableName" 
    WHERE yet_another_condition 
    AND yet_another_other_condition 
    ORDER BY CASE field_1 
    WHEN 'A' THEN 1 
    WHEN 'B' THEN 2 
    WHEN 'C' THEN 3 
    ELSE 4 
    END 
+0

काम नहीं करेगा क्योंकि '" फील्ड 1 "' कॉलम नाम नहीं है। – Benoit

+0

खेद नहीं हुआ, एक ही त्रुटि –

+0

हां, उसने देखा। उत्तर संशोधित .... – CristiC

1

पहले एक करता है क्योंकि आपको क्या करना चाहिए

ORDER BY CASE field_1 

"Field1" एक भी सबक्वेरी में ही उपलब्ध है काम नहीं है, और यूनियन को एक सामान्य उपनाम के साथ बनाने के बाद, आप उस कॉलम को "Field1" के रूप में संदर्भित नहीं कर सकते हैं।

+0

+1 धन्यवाद। मैंने ऐसा किया लेकिन मुझे यह त्रुटि मिल गई: त्रुटि: यूनियन/इंटरसेक्ट/एक्सेप्ट परिणाम पर आदेश परिणाम कॉलम में से एक पर होना चाहिए –

संबंधित मुद्दे