2011-06-21 38 views
9

Chạy PostgreSQL (7.4 và 8.x) và tôi nghĩ điều này đã hoạt động nhưng hiện tại tôi đang gặp lỗi.SQL ORDER BY with CASE with UNION ALL

Tôi có thể chạy truy vấn một cách riêng biệt và nó hoạt động tốt, nhưng nếu tôi UNION hoặc UNION ALL, nó sẽ phát ra lỗi.

này ra lỗi: (Cảnh báo: pg_query(): Truy vấn thất bại: ERROR: Cột "Field1" không tồn tại ... ORDER BY Case "Field1" 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 

tác phẩm này :

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 

và việc này cũng như:

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 

và nếu tôi rời khỏi ORDER BY và chỉ cần sử dụng UNION hoặc UNION ALL nó cũng vậy.

Bất kỳ ý tưởng nào?

Trả lời

13

Đặt tất cả mọi thứ trong một CHỌN:

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 

hoặc, tốt hơn, sử dụng bí danh trong ORDER BY, vì nó được thông qua vào cuối của UNION:

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

Sẽ không hoạt động vì '" Field1 "' không phải là tên cột. – Benoit

+0

xin lỗi đã không hoạt động, cùng một lỗi –

+0

Có, nhận thấy điều đó. Đã sửa đổi câu trả lời .... – CristiC

1

Người đầu tiên thực hiện không hoạt động vì bạn nên làm

ORDER BY CASE field_1 

"Field1" chỉ có sẵn trong một truy vấn con duy nhất, và sau khi bạn đặt UNION bằng bí danh chung, bạn không thể tham chiếu cột đó là "Field1" nữa.

+0

+1 để được trợ giúp về câu trả lời. Tôi đã làm điều này nhưng tôi nhận được lỗi này: L ERI: ORDER BY trên kết quả UNION/INTERSECT/EXCEPT phải nằm trên một trong các cột kết quả –