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, он также будет работать.

Любые идеи?


person Phill Pafford    schedule 21.06.2011    source источник


Ответы (2)


Поместите все в другой 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
person CristiC    schedule 21.06.2011
comment
@Phill: Во-первых, я не заметил, что вы использовали имя поля, а не псевдоним ... :) - person CristiC; 21.06.2011

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

ORDER BY CASE field_1

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

person Benoit    schedule 21.06.2011
comment
+1 за помощь с ответом. Я сделал это, но получаю следующую ошибку: ОШИБКА: ORDER BY для результата UNION / INTERSECT / EXCEPT должен быть в одном из столбцов результатов - person Phill Pafford; 21.06.2011