7

たとえば、SQLを使用して次のことができます。

SELECT (a+b) as c FROM table WHERE c < 5 AND (c*c+t) > 100;

Postgresを使用してそれを行う方法はありますか?

4

2 に答える 2

10

それをしてはいけない。PostgreSQLでも標準SQLでもありません。マニュアル:

出力列の名前は、 ORDER BYandGROUP BY句で列の値を参照するために使用できますが、WHEREorHAVING句では使用できません。そこで、代わりに式を書き出す必要があります。

この点で標準について議論することができます。ヒュー・ダーウェンは、私が最近言及されたこの記事でそれを行うために非常に長い時間を費やしています。

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は、より複雑な操作の場合、または中間結果を複数の(サブ)クエリで再利用する場合に特に役立ちます。

于 2012-06-27T02:07:11.813 に答える
4

これは、使用する可能性のある代替手段になる可能性があります。

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がそこでクエリ最適化を行うかどうかはわかりません。

于 2012-06-27T01:54:15.270 に答える