たとえば、SQLを使用して次のことができます。
SELECT (a+b) as c FROM table WHERE c < 5 AND (c*c+t) > 100;
Postgresを使用してそれを行う方法はありますか?
たとえば、SQLを使用して次のことができます。
SELECT (a+b) as c FROM table WHERE c < 5 AND (c*c+t) > 100;
Postgresを使用してそれを行う方法はありますか?
それをしてはいけない。PostgreSQLでも標準SQLでもありません。マニュアル:
出力列の名前は、
ORDER BY
andGROUP BY
句で列の値を参照するために使用できますが、WHERE
orHAVING
句では使用できません。そこで、代わりに式を書き出す必要があります。
この点で標準について議論することができます。ヒュー・ダーウェンは、私が最近言及されたこの記事でそれを行うために非常に長い時間を費やしています。
Federicoが提案するようなサブクエリ、または次のような共通テーブル式(CTE)を使用できます。
WITH cte AS (SELECT a + b AS c FROM x)
SELECT c
FROM cte
WHERE c < 5
AND (c*c+t) > 100;
CTEは、より複雑な操作の場合、または中間結果を複数の(サブ)クエリで再利用する場合に特に役立ちます。
これは、使用する可能性のある代替手段になる可能性があります。
SELECT foo.c
FROM (
SELECT (a+b) as c FROM table
) as foo
WHERE foo.c < 5
AND (foo.c*foo.c+t) > 100
パフォーマンスの観点からは、これは最適なソリューションではないと思います(fooサブクエリのWHERE句がないため、すべてのテーブルレコードが返されます)。Postgresqlがそこでクエリ最適化を行うかどうかはわかりません。