2011-06-21 13 views
9

Uruchamianie PostgreSQL (7.4 i 8.x) i myślałem, że to działa, ale teraz dostaję błędy.SQL ORDER BY z CASE z UNION ALL

Mogę uruchamiać zapytania osobno i działa dobrze, ale jeśli I UNION lub UNION ALL to spowoduje błąd.

to uwagę błędy: (Uwaga: pg_query(): Query failed: BŁĄD: kolumna "Pole1" nie istnieje ... ORDER BY CASE "Pole1" W ...)

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 

to działa :

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 

i to działa tak samo:

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 

i jeśli wyjdę poza ORDER BY i po prostu korzystać z Unii lub UNION ALL go działa również.

Jakieś pomysły?

Odpowiedz

13

umieścić wszystko w inny SELECT:

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 

lub lepiej użyć aliasu w kolejności, jak to jest przekazywane na koniec Unii:

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

Nie będzie działać, ponieważ '" Pole1 "' nie jest nazwą kolumny. – Benoit

+0

Niestety nie działa, ten sam błąd –

+0

Tak, zauważyłem to. Odpowiedź zmodyfikowana .... – CristiC

1

Pierwszy z nich robi nie działa, ponieważ należy zrobić

ORDER BY CASE field_1 

"Field1" jest dostępna tylko w jednym podzapytania, a po utworzeniu UNION ze wspólnym aliasem, nie możesz już odwoływać się do tej kolumny jako "Field1".

+0

+1 za pomoc w udzieleniu odpowiedzi. Zrobiłem to, ale otrzymałem ten błąd: ERROR: ORDER BY na wyniku UNION/INTERSECT/EXCEPT musi znajdować się w jednej z kolumn wyników –