SQL ORDER BY с CASE с UNION ALL

Запуск PostgreSQL (7.4 и 8.x), и я думал, что это работает, но теперь я получаю ошибки.

Я могу запускать запросы отдельно, и он работает нормально, но если я UNION или UNION ALL, он выдает ошибку.

Это ошибки: (Предупреждение: pg_query (): запрос не выполнен: ОШИБКА: столбец «Поле1» не существует … ЗАКАЗАТЬ СЛУЧАЙ «Поле1» 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 

Это работает:

 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 

и если я покину ORDER BY и просто использую UNION или UNION ALL, он также работает.

Есть идеи?

Поместите все в другой 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 

или, лучше, используйте псевдоним в ORDER BY, поскольку он передается в конце 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 

Первый не работает, потому что вы должны делать

 ORDER BY CASE field_1 

"Field1" доступно только в одном подзапросе, и после того, как вы сделаете UNION с общим псевдонимом, вы больше не можете ссылаться на этот столбец как "Field1" .