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