Вы можете переписать его как подзапрос:
select val1, val2, val3, val4
from (
SELECT val1, val2, val3, val=2 as val4 FROM table2
UNION
SELECT val1, val2, val3, val=3 as val4 FROM table3
) t
where some_condition
Однако будьте осторожны, потому что это не обязательно лучший вариант.
Это может вас устроить, потому что вы избежали переписать условие, но для планировщика запросов два запроса могут быть очень разными животными.Postgres иногда достаточно умен, чтобы вставлять условия в под-операторы, но один случай, который я никогда не видел, - это когда под-оператор имеет какие-либо агрегаты.
В частности, если условие помещеноснаружи (как показано выше), вы начнете с добавления двух целых таблиц.Затем вы агрегируете их, чтобы исключить дубликаты (это шаг, которого вы избежите, используя union all
вместо union
, кстати), и вы, наконец, отфильтруете строки в результирующем наборе, соответствующие вашему условию.
Для сравнения, при размещении внутри отдельных битов вы добавляете и сортируете два меньших набора строк.Это будет намного быстрее и будет занимать гораздо меньше памяти.
Короче говоря, фильтруйте строки как можно раньше в своих запросах.