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

Другие вопросы по тегам