sql >> データベース >  >> RDS >> PostgreSQL

SELECT、WHERE、およびORDER BY句の結果を再利用するにはどうすればよいですか?

    GROUP BYで およびORDER BY 列エイリアス(出力列)またはSELECTの序数を参照できる句 アイテムを一覧表示します。 ORDER BYのマニュアルを引用します :

    各式は、出力列の名前または序数(SELECTリストアイテム)にすることができます。 、または入力列の値から形成される任意の式にすることができます。

    大胆な強調鉱山。

    しかし、WHERE およびHAVING 句では、ベーステーブルの列(入力列)のみを参照できるため、関数呼び出しを詳しく説明する必要があります。

    SELECT *, earth_distance(ll_to_earth(62.0, 25.0), ll_to_earth(lat, lon)) AS dist
    FROM   venues 
    WHERE  earth_distance(ll_to_earth(62.0, 25.0), ll_to_earth(lat, lon)) <= radius 
    ORDER  BY distance;
    

    計算をCTEまたはサブクエリにパックする方が速いかどうかを知りたい場合は、EXPLAIN ANALYZEでテストしてください。 。 (私はそれを疑う。)

    SELECT *
    FROM  (
       SELECT *
             ,earth_distance(ll_to_earth(62.0, 25.0), ll_to_earth(lat, lon)) AS dist
       FROM   venues
       ) x
    WHERE  distance <= radius 
    ORDER  BY distance;
    

    @Mikeがコメントしたように、関数STABLEを宣言します。 (またはIMMUTABLE )関数呼び出しの結果は、単一のステートメント内の同一の呼び出しに対して複数回再利用できることをクエリプランナーに通知します。ここでマニュアルを引用します:

    STABLE関数はデータベースを変更できず、単一のステートメント内のすべての行に同じ引数が与えられた場合に同じ結果を返すことが保証されています。このカテゴリは、オプティマイザが関数の複数の呼び出しを1つの呼び出しに最適化することを可能にします

    大胆な強調鉱山。



    1. MySQLでシーケンスを作成する方法

    2. SQLServerの既存の列にデフォルトの制約を追加する方法

    3. macOSにPostgreSQLをインストールする方法

    4. psycopg2を使用してpostgresテーブルにデータをインポートする際の値エラー