Результат вычисления повторного использования 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 особенно полезны для более сложных операций или если вы хотите повторно использовать промежуточный результат в нескольких (суб) запросах.