PostgreSQL повторно использует результат вычисления в запросе выбора
Например, используя SQL я могу сделать:
SELECT (a+b) as c FROM table WHERE c < 5 AND (c*c+t) > 100;
Есть ли способ сделать это с помощью Postgres?
2 ответа
Это может быть альтернативой, которую вы можете использовать:
SELECT foo.c
FROM (
SELECT (a+b) as c FROM table
) as foo
WHERE foo.c < 5
AND (foo.c*foo.c+t) > 100
С точки зрения производительности, я думаю, что это не оптимальное решение (из-за отсутствия предложения WHERE в подзапросе foo, поэтому возвращаются все записи таблицы). Я не знаю, выполняет ли Postgresql оптимизацию запросов там.
Тебе этого не сделать. Ни в PostgreSQL, ни в стандартном SQL. Я цитирую руководство здесь:
Имя выходного столбца может использоваться для ссылки на значение столбца в
ORDER BY
а такжеGROUP BY
пункты, но не вWHERE
или жеHAVING
положения; вместо этого вы должны выписать выражение.
Можно было бы обсудить стандарт в этом отношении. Хью Дарвен на самом деле идет на многое, делая именно то, что в этой статье я недавно упоминал.
Вы можете использовать подзапрос, подобный предложенному Федерико, или выражение общей таблицы (CTE), например:
WITH y AS (
SELECT a + b AS c FROM x
)
SELECT c
FROM y
WHERE c < 5
AND (c*c+t) > 100;
CTE особенно полезны для более сложных операций или если вы хотите повторно использовать промежуточный результат в нескольких (под) запросах.